¿Por qué se usan con tanta frecuencia los tokens CSRF?

5

Los tokens CSRF se usan mucho .

El servidor establece un token en la cookie para ese dominio que (1) incluye en el formulario HTML o (2) Javascript puede leer e incluir en la solicitud. El servidor verifica que el token en la solicitud coincida con el token en la cookie.

¿Pero por qué no simplemente verifica el encabezado de Origen? Según OWASP , por eso existe:

  

El estándar Origin HTTP Header se introdujo como un método de defensa contra CSRF y otros ataques entre dominios.

"¿El origen no está allí? Si no, está bien. Si lo está, ¿es uno en el que yo confío (por ejemplo, el mismo origen)? Si es así, está bien".

Los tokens CSRF pueden ser problemáticos. Son

  • más difícil de entender para los principiantes: "Espere ... ¿Lo envío dos veces? ¿Qué es CRSF otra vez?"
  • requiere cookies (concedidas, no suele ser un problema)
  • más difícil de implementar: necesita controlador y vista
  • menos flexible: nunca se puede trabajar entre dominios
  • extraño en la configuración no web: "¿Por qué su API necesita un token CSRF?" "Oh, porque JS también usa eso"
  • más incómodo de implementar globalmente: "Vaya, olvidé la etiqueta CSRF aquí entre mis 25 campos de formulario HTML"

Dadas estas desventajas, ¿por qué los tokens CSRF se usan tan comúnmente, en lugar del encabezado de origen?

    
pregunta Paul Draper 08.12.2014 - 09:51
fuente

2 respuestas

6

Actualmente no puede depender del encabezado de origen, porque no está implementado en todos los navegadores que están en uso activo. Aparte de eso, Origin no se envía en todos los casos relevantes para CSRF, como

<img src=http://router/admin.cgi?...>
    
respondido por el Steffen Ullrich 08.12.2014 - 12:14
fuente
0
  

"¿El origen no está allí? Si no, está bien. Si lo está, ¿es uno en el que confío?   (por ejemplo, el mismo origen)? Si es así, está bien. "

Aunque puede usar el encabezado de origen para rechazar una solicitud. Si falta el encabezado de origen, no puede aceptarlo de forma segura, ni siquiera para las solicitudes POST. Por lo que sé, una solicitud de formulario HTML no incluye un encabezado de Origen, y tampoco incluye imgs, scripts, enlaces, imágenes de fondo de cos, u otros lugares que hacen solicitudes de obtención. Y, por supuesto, el encabezado Origin no se envía para las solicitudes XHR en el mismo host, por lo que necesita otro mecanismo de protección.

Una opción es colocar el token csrf en un encabezado personalizado, que es más fácil de hacer globalmente y no coloca el token en la URL para obtener solicitudes. Y luego, si lo desea, puede verificar que la solicitud tenga el encabezado de origen o el encabezado personalizado.

También puede hacer algo como el método que mencionó, siempre que rechace cualquier solicitud que no sea una solicitud de Ajax. Pero no estoy tan seguro de la seguridad de eso.

En resumen, el encabezado de Origen, por sí solo no es suficiente si desea realizar solicitudes en el mismo origen, pero se podría usar en combinación con otro método de protección csrf.

    
respondido por el Thayne 29.07.2015 - 09:35
fuente

Lea otras preguntas en las etiquetas