Foros del Web » Programando para Internet » PHP »

Token que no me funciona

Estas en el tema de Token que no me funciona en el foro de PHP en Foros del Web. ¡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. ...
  #1 (permalink)  
Antiguo 12/04/2012, 10:18
 
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.
  #2 (permalink)  
Antiguo 12/04/2012, 12:05
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 14 años, 2 meses
Puntos: 331
Respuesta: Token que no me funciona

Utiliza error reporting para ver qué está pasando:

Código PHP:
Ver original
  1. ini_set('display_errors', 1);
Evita el uso de $_REQUEST y con print_r() puedes volcar los valores de $_SESSION para ver porqué se detiene la ejecución del programa.
__________________
Fere libenter homines, id quod volunt, credunt.
  #3 (permalink)  
Antiguo 16/04/2012, 05:26
 
Fecha de Ingreso: marzo-2012
Ubicación: A Coruña
Mensajes: 29
Antigüedad: 12 años, 7 meses
Puntos: 1
Respuesta: Token que no me funciona

¡Hola! Perdón por tardar tanto en contestar, pero me olvidé de mirar si me habías respondido el viernes, y no estuve en el ordenador donde tengo esta aplicación el resto del fin de semana.

No tengo realmente ningún fallo que frene la aplicación, creo que es por eso por lo que no me sale nada con el error_reporting.

Mi problema es que siempre me detecta que $_POST['token'] y $_SESSION['token'] son distintos. Acabo de reducir el código únicamente a preguntar si son iguales una vez que se ha pulsado el botón, y me pone que son distintos.

Es más, basándome en el vídeo de youtube más sencillo que encontré, el de este enlace --> http://www.youtube.com/watch?v=4EtLQvjju54 he hecho el mismo ejemplo, todavía más corto, y nada, NUNCA me considera iguales $_POST['token'] y $_SESSION['token']. Éste es mi código brevísimo de ejemplo:
<?php
session_start();

if (isset ($_POST['submit'])){
if (isset ($_SESSION['token']) && $_POST['token'] == $_SESSION['token']){
$nombre = $_POST['nombre'];
echo "Primer nombre: $nombre";
}
else echo "No funciona";
}

$token = $_SESSION['token'] = md5(uniqid(rand(), TRUE));

?>

<form method = "post" action= "token.php">
<table>
<tr>
<td> First name: </td>
<td>
<input type="text" name="nombre"/>
</td>
</tr>
</table>
<input type="hidden" name ="token" value="<?=$token?>">
<input type="submit" name ="submit" value="sign up" />
</form>

¿Qué estoy haciendo mal? De verdad que no lo entiendo...

Pongo aquí mi formulario por si acaso el problema pudiera estar ahí, porque de verdad que no lo entiendo...
  #4 (permalink)  
Antiguo 16/04/2012, 05:27
 
Fecha de Ingreso: marzo-2012
Ubicación: A Coruña
Mensajes: 29
Antigüedad: 12 años, 7 meses
Puntos: 1
Respuesta: Token que no me funciona

¡Hola! Perdón por tardar tanto en contestar, pero me olvidé de mirar si me habías respondido el viernes, y no estuve en el ordenador donde tengo esta aplicación el resto del fin de semana.

No tengo realmente ningún fallo que frene la aplicación, creo que es por eso por lo que no me sale nada con el error_reporting.

Mi problema es que siempre me detecta que $_POST['token'] y $_SESSION['token'] son distintos. Acabo de reducir el código únicamente a preguntar si son iguales una vez que se ha pulsado el botón, y me pone que son distintos.

Es más, basándome en el vídeo de youtube más sencillo que encontré, el de este enlace --> http://www.youtube.com/watch?v=4EtLQvjju54 he hecho el mismo ejemplo, todavía más corto, y nada, NUNCA me considera iguales $_POST['token'] y $_SESSION['token']. Éste es mi código brevísimo de ejemplo:

<?php
session_start();

if (isset ($_POST['submit'])){
if (isset ($_SESSION['token']) && $_POST['token'] == $_SESSION['token']){
$nombre = $_POST['nombre'];
echo "Primer nombre: $nombre";
}
else echo "No funciona";
}

$token = $_SESSION['token'] = md5(uniqid(rand(), TRUE));

?>

<form method = "post" action= "token.php">
<table>
<tr>
<td> First name: </td>
<td>
<input type="text" name="nombre"/>
</td>
</tr>
</table>
<input type="hidden" name ="token" value="<?=$token?>">
<input type="submit" name ="submit" value="sign up" />
</form>

¿Qué estoy haciendo mal? De verdad que no lo entiendo... Gracias.
  #5 (permalink)  
Antiguo 16/04/2012, 07:24
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 14 años, 2 meses
Puntos: 331
Respuesta: Token que no me funciona

A mí me funciona, cambia esta linea para probar:

Código PHP:
Ver original
  1. value="<?php echo $token?>">

pueder ser por los open_short_tags.
__________________
Fere libenter homines, id quod volunt, credunt.
  #6 (permalink)  
Antiguo 17/04/2012, 11:03
 
Fecha de Ingreso: marzo-2012
Ubicación: A Coruña
Mensajes: 29
Antigüedad: 12 años, 7 meses
Puntos: 1
Respuesta: Token que no me funciona

Vaya crack estás hecho. Era porque tenía mal lo de value por lo que no me funcionaba ni siquiera el ejemplo ése.

El mío sigue sin funcionarme, pero voy a ir quitando y añadiendo paso a paso a ver si averigüo donde está el fallo.

Sino, a lo mejor, te tengo que volver a preguntar, jaja. ¡Gracias!
  #7 (permalink)  
Antiguo 17/04/2012, 11:11
 
Fecha de Ingreso: marzo-2012
Ubicación: A Coruña
Mensajes: 29
Antigüedad: 12 años, 7 meses
Puntos: 1
Respuesta: Token que no me funciona

¡Ya está! Tenía repetida la definición del $token, la había puesto antes del "if isset(...)", y la moví para abajo, pero se ve que la había cortado en vez de pegarla. Cosas que pasan :p

¡Muchas gracias por tus respuestas! Que además la última era una chorrada, cuestión de revisar bien el código, a lo cual parece que le hayas dedicado tú más tiempo que yo, a pesar de ser para mi proyecto, xD.

Saludos.

Etiquetas: formulario, html, mysql, sql, tabla, token, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:32.