OWASP tiene una buena guía para la prevención de ataques CSRF here:
mirando la cabecera Referer es sin duda el más fácil, y es una buena idea por lo menos log casos en que el Referer es una tercera parte o vacía. Sin embargo, hay varios inconvenientes que hacen que usar el árbitro solos no fiable:
- cortafuegos corporativos pueden despojar a la cabecera árbitro para motivos de privacidad
- El árbitro no se envía cuando se pasa de HTTPS a HTTP
- En ataques CFRF, en general, es difícil "falsificar" el referer, pero puede ser done utilizando etiquetas meta-refresh.
Afortunadamente, WebFlow hace que sea más fácil implementar un filtro CSRF de token-por-flujo de invocación único personalizado (¡es posible que no tenga que modificar ninguna vista/formulario)!
Primero, use un FlowExectionListener para crear un nuevo token aleatorio cada vez que se inicie un flujo y guárdelo en el FlowScope. Luego, cada vez que se señala un evento, verifique que el token enviado (enviado como un parámetro en la solicitud) sea igual al valor almacenado en el FlowScope.
Luego, configure un FlowUrlHandler personalizado que añada el parámetro "_token" a las URL generadas, por lo que si ha estado usando $ {flowExecutionUrl} para referenciar sus flujos, el token se agregará siempre que POST/GET vuelva a su flujo automáticamente . Para buscar el token de la flowScope desde el interior del FlowUrlHandler, he tenido que recurrir al uso de RequestContextHolder
private String retrieveToken() {
RequestContext requestContext = RequestContextHolder.getRequestContext();
if (requestContext == null) {
return null;
}
return (String) requestContext.getFlowScope().get(CsrfTokenFlowListener.TOKEN_NAME);
}
...
Este método incluirá el CSRF token de cada vez que $ salida {flowExecutionUrl} - tanto para GET y POST, y si están usando post-redirect-get, puede asegurarse de que el token CSRF no aparezca en la barra de URL.
Quisiera advertir contra sólo el control de fichas para CSRF Mensajes:
WebFlow y muchos otros frameworks web no distinguen entre GET y POST - por defecto por lo general, se puede utilizar un GET para hacer lo que se hace con un POST , a menos que usted mismo verifique el método de solicitud (lo cual sería una buena idea de todos modos). Por lo tanto, un atacante que desee eludir su filtro CSRF solo haría un GET en lugar de un POST.
Editar: Una de las desventajas a tener en cuenta en la inclusión de fichas CSRF en el $ {flowExecutionUrl} es que el token CSRF es probable que siempre se enviará como parte de la URL de solicitud (ya que sería parte del formulario HTML de atributo 'acción'), y nunca en un cuerpo POST. Incluir información confidencial en la URL de la solicitud no es excelente, ya que es más probable que se registre en los registros del servidor/ISP. La alternativa es agregar una entrada oculta en cada formulario que contenga el token CSRF y solo exigir su presencia para las solicitudes POST.
Tenga en cuenta que algunos usuarios avanzados tendrán los cabezales de referencia apagados (por razones de privacidad) y que debe tener cuidado con los marcadores (aunque las personas realmente no deberían marcar páginas POST), asegúrese de redireccionar el navegador a otra página después de procesar los datos POST. – RelaXNow
Sé que esta publicación es antigua, pero fue un éxito de Google para mi búsqueda. Por favor, no sigas este consejo. Los encabezados de Referer son spoofables. Consulte esto para obtener más información: http://stackoverflow.com/questions/1413930/is-checking-the-referrer-oughough-to-protect-against-a-csrf-attack –
@ John.Larison Sí, es muy fácil para suplantar a su referencia en su propio navegador, sin embargo, es imposible hacerlo en un ataque CSRF. Consulte la hoja de referencia de prevención de CSRF de OWASP y evite divulgar información claramente incorrecta. – rook