Foro de elhacker.net

Programación => Desarrollo Web => Mensaje iniciado por: Leguim en 4 Diciembre 2019, 13:30 pm



Título: [Pregunta]: Anti-CSRF 2.0 (Dilema)
Publicado por: Leguim en 4 Diciembre 2019, 13:30 pm
Buenos días,

hasta día de hoy mi protección para ataques CSRF es generar un token de seguridad o aleatorio para cada formulario, es decir si yo entro a la pagina login, efectivamente me va a generar un token con el nombre del formulario, "token_csrf_form_login" quedando así $_SESSION['token_csrf_form_login"] después si entro a el formulario de registro $_SESSION['token_csrf_form_registry'] cada una de estas sessiones va a tener un token diferente pero hay un problema con este método y es que si la persona esta con dos formularios iguales a la misma vez se va a generar un problema...

[Page A (Registry)] [Page B (Registry)]

Primero va a generar un tocken para form_registry, después cuando vuelva a abrir el mismo formulario desde otra ventana o pestaña va a volver a generar el token y va a dejar obsoleto el anterior, por lo que el formulario que se abrió primero quedará inoperable, va a terminar dando un error para la primera pestaña o ventana que haya.. cargado el formulario antes.

Buscando por ahí varias formas de crear token se sigue un patrón (es material del 2011 a el 2014) generar el token una vez que el usuario se logea.

[Usuario inicia sesión]
[Genera tocken anti CSRF] => $_SESSION['token_csrf'] = [Dato aleatorio];
y todos los formularios u otros métodos que requieran este tipo de seguridad van a compartir el mismo token (por lo menos hasta que el usuario se desconecte, ahí ya se destruyen todas las sessiones).

¿Qué opinan de esto? ¿Se inclinan por la opción A u opción B?


Título: Re: [Pregunta]: Anti-CSRF 2.0 (Dilema)
Publicado por: MinusFour en 4 Diciembre 2019, 14:14 pm
Lo que podrías hacer es no invalidar el token si el usuario vuelve a abrir el formulario (no reescribir el token si ya hay una entrada) y simplemente reusar el token anterior. De forma que en lugar de tener un token por sesión tienes un token único por sesión por cada formulario.


Título: Re: [Pregunta]: Anti-CSRF 2.0 (Dilema)
Publicado por: Leguim en 4 Diciembre 2019, 14:18 pm
Lo que podrías hacer es no invalidar el token si el usuario vuelve a abrir el formulario (no reescribir el token si ya hay una entrada) y simplemente reusar el token anterior. De forma que en lugar de tener un token por sesión tienes un token único por sesión por cada formulario.

¡Tenes razón!
¿Como se me pasó? jaja GRACIAS ya lo hago!  ;-) ;-) ;-) ;-)


Título: Re: [Pregunta]: Anti-CSRF 2.0 (Dilema)
Publicado por: #!drvy en 4 Diciembre 2019, 15:32 pm
Hace tiempo, cuando te pase la funcionalidad de generar y comprobar tokens, esa parte estaba prevista pues podrías generar y validar tokens diferentes...

https://foro.elhacker.net/php/problema_sistema_anti_ataques_csrf-t499970.0.html;msg2206334#msg2206334


Código
  1. $token1 = createToken('formulario1');
  2. $token2 = createToken('formulario2');
  3.  
  4. // ---------------------------
  5.  
  6. if (isset($_POST['token_form_1']) && validateToken('formulario1', $_POST['token_form_1'])) {
  7.    echo 'token valido';
  8. }
  9.  
  10. if (isset($_POST['token_form_2']) && validateToken('formulario2', $_POST['token_form_2'])) {
  11.    echo 'token valido';
  12. }


Por supuesto, también es valida y hasta casi me parece mejor la idea de usar un token por página en vez de por formulario.

Saludos


Título: Re: [Pregunta]: Anti-CSRF 2.0 (Dilema)
Publicado por: Leguim en 4 Diciembre 2019, 15:47 pm
Gracias!

Si, igual es un muy buen sistema el Anti-CSRF que me pasaste ahora lo voy a mejorar un poco más.