¡Hola! Estoy intentando proteger al máximo mi aplicación, y según he leído este enlace:
http://www.slideshare.net/flaiwebnected/bloque-1-php-y-seguridad-web
para protegerse de ataques CSRF se puede utilizar un token.
He visto este vídeo en youtube que lo explica todo muy bien para hacer un token básico → http://www.youtube.com/watch?v=4EtLQvjju54
Sin embargo, en mi aplicación, cuando pongo el
if (isset ($_SESSION['token']) && $_POST['token'] == $_SESSION['token']){
lo que me ocurre es que no me identifica si el usuario se registró correcta ni incorrectamente, y directamente se queda en el mismo script, ni me funciona el “header” para ir a la siguiente página, ni me sale ningún mensaje de error de acceso no autorizado.
Éste es el código que tengo en lo que respecta a esta parte:
// Iniciamos la sesión
session_start();
// Si se ha enviado el formulario (ver abajo de todo):
if (isset($_REQUEST['boton'])){
if (isset ($_SESSION['token']) && $_POST['token'] == $_SESSION['token']){
$user = GetSQLValueString($_REQUEST['user'], 'text');
$key = GetSQLValueString($_REQUEST['key'], 'text');
$user = htmlspecialchars($user);
$key = htmlspecialchars($key);
$tipo_admin=$resultado['nivel'];
// A continuación vemos si puso algo en el usuario y contraseña:
if (isset($user) && isset($key)){
if (!ctype_alnum($_REQUEST['user']) || !ctype_alnum($_REQUEST['key'])){
echo "<p align='center'>
Sólo se permiten caracteres de la A a la Z (mayúsculas o minúsculas) o números del 0 al 9 </p>";
}
else {
mysql_select_db ($database_conexion, $conexion);
$instruccion=sprintf("SELECT administrators_id_admin, administrators_user, administrators_key, administrators_nivel
FROM `web_2.0_administradores_table`
WHERE administrators_user = $user and administrators_key = md5($key)");
$consulta = mysql_query ($instruccion, $conexion)
or die ('Fallo en la consulta');
// Miramos el número de filas de la tabla:
$nfilas = mysql_num_rows ($consulta);
// Si los datos introducidos son correctos
if ($nfilas > 0)
{
$superadmin = $user;
// Como register_globals está en Off:
$_SESSION["superadmin"]=$user;
for ($i=0; $i<$nfilas; $i++)
{
$resultado = mysql_fetch_array ($consulta);
$nivel = $resultado['administrators_nivel'];
}
// Cerramos la conexión:
mysql_close ($conexion);
}
}
}
}
}
$token = $_SESSION['token'] = md5(uniqid(mt_rand(), true));
echo $token;
// Si la sesión está iniciada
if (isset ($_SESSION['superadmin'])){
header ('location: web_2.0_admin_panel/web_2.0_admin_panel_file.php?admin='.$nivel.'');
}
elseif (isset($user)){
print ("<P ALIGN='CENTER'> Acceso no autorizado </P>\n");
print ("<P ALIGN='CENTER'>[ <A HREF='web_2.0_admin_istration_file.php'> Volver a conectar </A> ]</P>\n");
}
// Si el intento de entrada es fallido:
else{
?>
<div id="centro">
<form class='entrada' name='inicio' action='web_2.0_admin_istration_file.php' method='post'>
<p align=center> Usuario: <input type='text' name='user' size='20'/> </p>
<p align=center> Contraseña: <input type='password' name='key' size='20'/></p>
<p align=center>
<input type='hidden' name='token' value='<?php $token ?>'/>
<input type='submit' name='boton' value='Entrar'/> </p>
</form>
</div>
<?php
}
¿Alguien me puede decir qué es lo que me falla? Muchas gracias por adelantado.