Ver Mensaje Individual
  #1 (permalink)  
Antiguo 12/04/2012, 10:18
el_cos
 
Fecha de Ingreso: marzo-2012
Ubicación: A Coruña
Mensajes: 29
Antigüedad: 12 años, 7 meses
Puntos: 1
Token que no me funciona

¡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.