2010-05-03 20 views

Respuesta

4

La forma más fácil de evitar CSRF es consultar el request.getHeader("referer"); para asegurarse de que la solicitud proceda del mismo dominio. Este método está cubierto por el CSRF Prevention Cheat Sheet.

Es común ver este sistema de protección CSRF en hardware de red con requisitos de memoria limitados, Motorola usa este método en la mayoría de sus hardware. Esta no es la protección CSRF más segura, la protección basada en tokens es mejor, pero ambos sistemas aún se pueden pasar por alto con xss. El mayor problema con la protección CSRF basada en token es que se necesita mucho tiempo para volver atrás y solucionar cada solicitud y es probable que se pierda algunas solicitudes.

Una forma segura de implementar esto es verificar el referer en todas las solicitudes POST entrantes, y usar POST para funciones confidenciales como cambiar contraseñas, agregar cuentas de usuario, ejecutar código, realizar cambios de configuración. GET solo debe usarse para navegación o búsqueda, básicamente GET es seguro para cualquier cosa que no cause un cambio de estado.

Asegúrese de probar su sitio con un xss scanner.

+0

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

+0

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 –

+4

@ 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

2

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.

Cuestiones relacionadas