token contra CSRF

Iniciado por nØFi#, 21 Octubre 2009, 20:22 PM

0 Miembros y 1 Visitante están viendo este tema.

nØFi#

Buenas,
estoy programando un panel de admin con varios formularios para hacer cosas, la cuestion es que quiero añadir tokens en cada uno de ellos para evitar csrf.
Tengo una duda sobre la creación de dicho token (un numero aleatorio pasado a md5), que seria mejor crear un unico token al hacer login en el panel y usar este para todos los formularios o crear un token distinto cada vez que se acceda a un formulario??
#

WHK

esque si haces un solo token para todo entonces el que entre al sistema podrá obtener ese token y usarlo contra otro usuario de esepanel y en el caso de que fuera uno por usuario estarias dando la posibilidad de que si alguien llega a robarle el token a alguien este le podrá ejecutar csrf, en cambio si ese token cambia en cada formulario aunque yo te robe el token no podré ejecutarte nada porque no se cual será el proximo token.

nØFi#

Ahora me surge otra duda sobre la creacion de los tokens..

Supongamos que tenemos 40 formularios diferentes en el panel y cada vez que el usuario entra en uno se genera un token (se guarda el valor del token en la session).

Si el usuario entra en los 40 formularios sin hacer ningun cambio se generan 40 tokens distintos, la pregunta es: se guardan en diferentes variables de session? (es decir $_SESSION['token_formu1'],$_SESSION['token_formu2'],... ) o se guarda en la misma variable todos los formularios?

Guardarlo en diferentes variables lo veo muy ineficiente, porque si entran 1000 usuarios y se generan tropecientos mil valores en la session, el servidor ira muy cargado. Y si el valor se guarda en la misma variable.. que pasaria si se abren dos formularios distintos en pestañas?? petaria fuerte XD

Nose como seria la mejor forma, alguna idea?

Thx!
#

nØFi#

#3
Me he estado leyendo este paper (muy bueno por cierto) y proponen varios metodos para evitar CSRF. Un metodo que me ha gustado es el de generar un token concatenando varios parametros (por ejemplo 'nombre_del_formulario'+secret+sesionID), encriptarlo y meterlo en un hidden (sin guardar en session). Luego cuando validas el formulario vuelves a hacer la concatenacion y comparas que sea igual que el hidden. Este metodo no necesita guardar nada en session, pero por contra necesita mas cpu para ejecutarlo. Creo que usaré este metodo.. alguna sugerencia?? :D
#

WHK

cuando el usuario inicia sesion le haces session_start() y le declaras una variable en su base de datos llamada, luego cuano se carguen los datos a la variable donde contiene los datos del usuario con select * from users tendrás el valor del token y utilizas ese para todos los formularios, luego verificas si el valor del token enviado por la peticion post corresponde al token de su sesion entonces todo bien, si no entonces que indique que su sesion no es valida.

deibix