Protección Ajax y CSRF

7

Sin entrar en demasiados detalles, tengo un sitio que es 100% Ajax. Todas las solicitudes al sitio (tanto GET como POST) se realizan a través de Ajax. Ahora tengo que implementar la protección CSRF, y todas las soluciones que encontré se reducen a enviar un token CSRF en los encabezados, pero la mayoría de ellos obtienen este token desde HTML o una cookie que viene con la solicitud GET.

Ahora que mi sitio es 100% Ajax y no se vuelve a cargar. Me pregunto si podría, antes de cada solicitud POST, realizar una solicitud GET al servidor para obtener el token y luego enviarla en los encabezados junto con la solicitud POST, por ejemplo

Envíe la solicitud GET a aaa.com/get-csrf-token para obtener el token y luego envíe ese token junto con la solicitud en los encabezados, si alguien de otro sitio realiza una solicitud GET a aaa.com/get-csrf-token y el servidor devuelve un token, luego Como sé, todavía no pueden leer ese valor.

Como el token se genera para cada sesión, simplemente puedo verificar que el token enviado sea el mismo que tengo en el memchache que está asociado con esa sesión.

¿Podría alguien decirme si esto funcionaría?

    
pregunta Dave 16.09.2012 - 05:08
fuente

2 respuestas

5

Sí, podrías hacer esto. Esto debería estar bien. Es una defensa razonable contra CSRF.

Asegúrese de que las acciones de efecto secundario solo puedan suceder a través de POST (nunca a través de GET), y que todas las POST verifiquen la presencia del token. Además, asegúrese de generar el token como un número pseudoaleatorio criptográficamente sólido (por ejemplo, utilizando CryptGenRandom() , /dev/urandom , SecureRandom o similar) y guárdelo en el estado de la sesión.

No sé si esto tiene algún beneficio, por ejemplo, el envío doble de cookies, pero podría hacerlo y debería protegerse contra CSRF con éxito.

    
respondido por el D.W. 16.09.2012 - 05:38
fuente
2

Realmente, dos solicitudes para cada tarea es una sobrecarga de rendimiento. Simplemente puede lograr esto utilizando una sola solicitud. Simplemente puede validar el token durante la solicitud POST y enviar el nuevo token con cada solicitud. Usando JS, asegúrese de recoger el último valor de cookie y adjuntarlo a cada solicitud de AJAX enviada.

De hecho, si desea reducir su dolor en la protección CSRF de su aplicación web, puede ver OWASP CSRF Protector Project , (disponible para php solo actualmente), hace todo lo necesario para mitigar la CSRF y funciona bien con AJAX (tanto XHR como activeXObject )

    
respondido por el mebjas 17.07.2014 - 08:56
fuente

Lea otras preguntas en las etiquetas