Bienvenido a datoweb.com!! En este foro podrás encontrar ayuda sobre diseño y desarrollo web en general. Si quieres formar parte de esta comunidad para pedir ayuda o colaborar ayudando a otros usuarios del foro solo tienes que registrarte desde el siguiente enlace: Registrarse en el Foro

Agregar correctamente el token CSRF usando PHP

Hoy vengo a traerles un script que realice para evitar los atacques de CSRF.

Lo primero que es ATAQUE CSRF?
CSRF son las siglas de "Cross-Site Request Forgery", o lo que es lo mismo, "Falsificación de Peticiones de Sitios Cruzados". Dicho ataque se produce cuando, creando un enlace a un web especialmente manipulado, podemos hacer que, si esa persona tiene una sesión iniciada en dicho sitio web, se produzca, de manera involuntaria, una acción determinada. Pongamos un ejemplo:

La página "banco.com" tiene un sistema para enviar dinero de un cliente a otro. En nuestro panel de control, tenemos un enlace para enviar dinero a Pepito, cuyo ID de usuario es "12345". En ese caso, el enlace que nos aparecería sería el siguiente:

www.banco.com/enviar_dinero.php?cantidad=200&destino=12345

[*] Cantidad: 200(€).
[*] Destino: 12345 (El usuario con ID 12345, en este caso, Pepito).

El origen del dinero (nosotros) es definido porque, previamente, habremos iniciado sesión en la página con nuestro usuario y contraseña. Bien...

¿Qué ocurriría si alguien manipulara ese enlace? Imaginaos a un atacante, con ID 54321. Dicho atacante se dedica a enviar correos electrónicos aleatoriamente, como podría ser:

Buenas, he visto esta foto tuya en esta página y la verdad es que me sorprende que pudieras hacer algo así... ¿Qué te ha pasado?

Si pasais el ratón por encima de "esta foto tuya", veréis que el enlace es el siguiente: www.banco.com/enviar_dinero.php?cantidad=1000&destino=54321

[*] Cantidad: 1000(€).
[*] Destino: 54321 (El usuario con ID 54321, en este caso, el atacante).

Si alguien que haya iniciado sesión en la página www.banco.com pulsa sobre dicho enlace, enviará 1000€ a la cuenta con ID 54321... Y el atacante podrá pagarse unas lujosas vacaciones a su costa. Y esto, señores, es un bonito ataque CSRF.

Ahora bien... ¿Cómo evitamos un ataque CSRF (de parte del servidor)?

Bien, para protegerse de el uso indiscriminado de estos enlaces, cuando se carga una página, se crea un identificador único para esa página llamado "token", que servirá para certificar que, efectivamente, hemos sido nosotros (y no otro) el que ha cargado dicha página y no se ha accedido externamente a través de un enlace malicioso. Dicho token varía de una petición a otra (cuando cambiamos de una página a otra, tenemos otro token diferente), y tiene un tiempo de caducidad. Cuando dicho tiempo de caducidad ocurre, aunque sigamos logueados en la web en cuestión, tendremos que volver a cargar la página para obtener otro token y que nuestras acciones sean válidas. Es por esto que si tratamos de ejecutar una acción que requiera un token válido, aparezca (aunque no sea cierto) el mensajito de CSRF Attack Detected. Esto implica enviar formularios (como crear entradas en el periódico, o leer los comentarios de los feeds).

Y finalmente... ¿Por qué aparece el mensaje de CSRF Attack Detected?

Bien, Apache (servidor HTTP que, supongo, será el que utilice este juego) tiene un plugin llamado "mod_security" que, entre otras cosas, tiene incorporado un sistema de protección contra ataques CSRF mediante el uso de csrf_token. Dicho plugin no está de ninguna manera creado ni soportado, por lo que ellos no pueden hacer nada por que dicho mensaje desaparezca. De hecho, que aparezca ese mensaje es muestra de que, al menos, la seguridad se la toman en serio.

No es fallo, es el protocolo que se ha de seguir para garantizar la seguridad. Si te tiras dos horas en una misma página, no haces nada, y publicas tu tochopost sin hacer un CTRL+C al menos, te la juegas a que te salga el mensajito del CSRF Attack Detected.

Todo esto lo cuento desde el conocimiento que tengo, pues las páginas web son a lo que me dedico en la vida real.

Espero no haberos abrumado con mi artículo, cualquier duda, contestaré por comentarios.

hay muchas manera de crear un TOKEN de seguridad pero yo uso actualmente esta cada vez que se realiza una petición http generamos un token de seguridad nuevo así si otra persona no autorizada al dominio intenta colgar el mismo token el token que coloque va ser invalido.
if (empty($_SESSION['token'])) {
if (function_exists('mcrypt_create_iv')) {
$_SESSION['token'] = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));
}else{
$_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(32));
}
}
if (!empty($_POST['token'])) {
if (hash_equals($_SESSION['token'], $_POST['token'])) {
//prosesamos el POST
echo $_POST['nombre'];
}else{
echo "TOKEN NO VALIDO";
//Registre esto como una advertencia y vigile estos intentos
}
}
?>
<form action="" method="post">
<input type="text" name="nombre">
<input type="hidden" name="token" value=<?=$_SESSION['token'];?>>
<br>
<input type="submit" value="enviar">

</form>

Saludos.



2
Puntos
5663
Visitas
1
Resp
Por capu98 hace 65 meses
Principiante
Respuesta #1
muy buena guía si señor! salu2
0
Puntos
Por alber hace 65 meses
Administrador
Compartir en facebook
Compartir en twitter
Compartir
Para comentar Inicia sesión o Registrate