Existen varias técnicas que, cuando se utilizan juntas, proporcionan una protección CSRF suficiente.
único token
Una muestra única, específica de la sesión es lo suficientemente bueno para la mayoría de aplicaciones. Solo asegúrese de que su sitio no tenga vulnerabilidades XSS, de lo contrario cualquier tipo de técnica de token que emplee es un desperdicio.
Llamada de AJAX para regenerar el token es una mala idea. ¿Quién protegerá a los guardias? Si la llamada AJAX en sí misma es vulnerable a CSRF, de alguna manera se frustra el propósito. Múltiples tokens con AJAX son en general una mala idea. Te obliga a serializar tus solicitudes, es decir, solo se permite una solicitud AJAX a la vez. Si está dispuesto a vivir con esa limitación, tal vez pueda utilizar el token para la segunda llamada AJAX en respuesta a la primera solicitud.
Personalmente, creo que es mejor volver a autenticar al usuario para las transacciones críticas y proteger las transacciones restantes con el token específico de la sesión.
encabezado HTTP personalizado
Puede agregar un encabezado HTTP personalizado a cada una de sus peticiones, y comprobar su presencia en el lado del servidor. La clave/valor real no necesita ser secreto, el servidor solo necesita asegurarse de que exista en la solicitud entrante.
Este enfoque es lo suficientemente bueno para proteger CSRF en las versiones más nuevas de los navegadores, sin embargo, es posible solucionar este problema si su usuario tiene una versión anterior para Flash Player.
Comprobación Referente
Comprobación de la cabecera de referencia es también bueno para proteger CSRF en los navegadores más recientes. No es posible falsificar este encabezado, aunque sí fue posible en versiones anteriores de Flash. Entonces, si bien no es infalible, aún agrega cierta protección.
Resolver Captcha
obligando al usuario a resolver un CAPTCHA es también eficaz contra CSRF. Es incómodo como el infierno, pero bastante efectivo. Esta es quizás la única protección CSRF que funciona incluso si tiene vulnerabilidades XSS.
Resumen
- utiliza un identificador de sesión basada, pero volver a autenticarse para transacciones de alto valor
- Agregar un encabezado HTTP personalizado, y comprobar además referencia. Ambos no son infalibles por sí mismos, pero no duelen
Agregando un encabezado http personalizado me molesta, estoy bastante seguro de que puede forjar encabezados http personalizados con flash y disparar una solicitud a otro servidor, siempre y cuando el elemento de encabezado no está en una lista negra. He revisado los cambios recientes en flash (en los últimos 3 meses) y han corregido la capacidad de controlar todo el segmento de POST que se necesitaba para los ataques de "carga de archivos entre sitios". Aparte de eso, creo que es una buena información y te di un +1. – rook
Sí, aquí está la lista negra, por supuesto, el referer no está permitido, pero literalmente todo lo demás es. http://kb2.adobe.com/cps/403/kb403030.html – rook
@The Rook - Re. Agregar encabezados personalizados: consulte http://www.adobe.com/devnet/flashplayer/articles/flash_player_10_security.pdf. Específicamente, consulte la sección titulada "Permisos de envío de encabezado". Cito 'Cuando un archivo SWF desea enviar encabezados HTTP personalizados en cualquier lugar que no sea su propio host de origen, debe haber un archivo de política en el servidor HTTP al que se envía la solicitud'. Recuerde http://stackoverflow.com/questions/2609834/gwt-rpc-does-it-do-oughoughto-protect-against-csrf? Ahí es donde aprendí este hecho de la manera difícil. –