¿Cuál es el punto del encabezado X-Requested-With?

224

JQuery y otros marcos agregan el siguiente encabezado:

X-Requested-With: XMLHttpRequest

¿Por qué se necesita esto? ¿Por qué un servidor querría tratar las solicitudes AJAX de manera diferente a las solicitudes normales?

ACTUALIZACIÓN : Acabo de encontrar un ejemplo de la vida real con este encabezado: https://core.spreedly.com/manual/payment-methods/adding-with-js . Si el procesador de pagos se solicita sin AJAX, redirige de nuevo al sitio web original cuando haya terminado. Cuando se solicita con AJAX, no se realiza la redirección.

Gili
fuente
77
"[Cuando] se solicita sin AJAX, se redirige de nuevo al sitio web original cuando se realiza. Cuando se solicita con AJAX, no se realiza la redirección". -> Eso es exactamente por qué querrías hacerlo. :)
Robert Christian
1
stackoverflow.com/questions/3315914/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

257

Una buena razón es la seguridad: esto puede evitar ataques CSRF porque este encabezado no se puede agregar al dominio cruzado de solicitud AJAX sin el consentimiento del servidor a través de CORS .

Solo los siguientes encabezados tienen dominio cruzado permitido:

  • Aceptar
  • Aceptar lenguaje
  • Lenguaje de contenido
  • ID del último evento
  • Tipo de contenido

cualquier otra causa que se emita una solicitud "previa al vuelo" en los navegadores compatibles con CORS.

Sin CORS no es posible agregar X-Requested-Witha una solicitud XHR de dominio cruzado.

Si el servidor verifica que este encabezado esté presente, sabe que la solicitud no se inició desde el dominio de un atacante que intentaba hacer una solicitud en nombre del usuario con JavaScript. Esto también verifica que la solicitud no se haya PUBLICADO desde un formulario HTML normal, del cual es más difícil verificar que no es dominio cruzado sin el uso de tokens. (Sin embargo, verificar el Originencabezado podría ser una opción en los navegadores compatibles, aunque dejará vulnerables los navegadores antiguos ).

Nuevo bypass Flash descubierto

Es posible que desee combinar esto con un token , porque Flash que se ejecuta en Safari en OSX puede establecer este encabezado si hay un paso de redireccionamiento . Parece que también trabajó en Chrome , pero ahora se remedió. Más detalles aquí, incluidas las diferentes versiones afectadas.

OWASP recomienda combinar esto con un cheque de origen y referencia :

Esta técnica de defensa se discute específicamente en la sección 4.3 de Defensas sólidas para la falsificación de solicitudes entre sitios. Sin embargo, las omisiones de esta defensa usando Flash fueron documentadas ya en 2008 y nuevamente en 2015 por Mathias Karlsson para explotar una falla CSRF en Vimeo. Pero, creemos que el ataque Flash no puede suplantar los encabezados Origin o Referer, por lo que al verificar ambos creemos que esta combinación de comprobaciones debería evitar los ataques CSRF de bypass de Flash. (NOTA: Si alguien puede confirmar o refutar esta creencia, infórmenos para que podamos actualizar este artículo)

Sin embargo, por las razones ya discutidas, verificar Origen puede ser complicado.

Actualizar

Escribió una publicación de blog más detallada sobre CORS, CSRF y X-Requested-With aquí .

SilverlightFox
fuente
14
No lo entiendo ¿Qué impide que el atacante genere una solicitud y agregue también un X-Requested-Withencabezado?
Greg
13
@Greg: El navegador, no le permitirá el dominio cruzado.
SilverlightFox
2
Oh, no me di cuenta de que no se necesitaría ninguna configuración CORS mientras estés en el mismo dominio. Sin embargo, es obvio cuando lo piensas. Gracias !
Greg
10
@ vol7ron: Nada los detiene, pero entonces no tendrán las cookies de sus víctimas en la solicitud, lo que vence el objeto de ellos al hacer la solicitud. Para que un CSRF tenga éxito, el atacante necesitaría que el navegador adjunte automáticamente las cookies con la solicitud, por lo que sin el navegador no hay ataque de CSRF.
SilverlightFox
3
@ vol7ron: El primero. CSRF es un problema adjunto confuso . El navegador es el delegado confundido y es "engañado" para que envíe cookies por una solicitud que el usuario no hizo.
SilverlightFox
25

Asegúrese de leer la respuesta de SilverlightFox. Destaca una razón más importante.

La razón es principalmente que si conoce el origen de una solicitud, es posible que desee personalizarla un poco.

Por ejemplo, supongamos que tiene un sitio web que tiene muchas recetas. Y utiliza un marco jQuery personalizado para deslizar recetas en un contenedor en función de un enlace en el que hacen clic. El enlace puede serwww.example.com/recipe/apple_pie

Ahora normalmente eso devuelve una página completa, encabezado, pie de página, contenido de recetas y anuncios. Pero si alguien está navegando en su sitio web, algunas de esas partes ya están cargadas. Por lo tanto, puede usar un AJAX para obtener la receta que el usuario ha seleccionado, pero para ahorrar tiempo y ancho de banda no cargue el encabezado / pie de página / anuncios.

Ahora puede escribir un punto final secundario para los datos, www.example.com/recipe_only/apple_piepero es más difícil de mantener y compartir con otras personas.

Pero es más fácil detectar que se trata de una solicitud ajax que realiza la solicitud y luego devuelve solo una parte de los datos. De esa forma, el usuario desperdicia menos ancho de banda y el sitio parece más receptivo.

Los marcos simplemente agregan el encabezado porque a algunos les puede resultar útil realizar un seguimiento de qué solicitudes son ajax y cuáles no. Pero depende completamente del desarrollador para usar tales técnicas.

En realidad es algo similar al Accept-Languageencabezado. Un navegador puede solicitar un sitio web. Muéstrame una versión rusa de este sitio web sin tener que insertar / ru / o similar en la URL.

EWit
fuente
30
Wow, eso suena como una horrible pesadilla de mantenimiento. Si desea devolver una representación diferente de la misma página, debe proporcionar un tipo de contenido diferente al Acceptencabezado. Usar un encabezado personalizado para esto suena como el camino equivocado.
Gili
10

Algunos marcos están usando este encabezado para detectar solicitudes xhr, por ejemplo, Grails Spring Security está usando este encabezado para identificar la solicitud xhr y dar una respuesta json o una respuesta html como respuesta.

La mayoría de las bibliotecas de Ajax (Prototype, JQuery y Dojo a partir de v2.1) incluyen un encabezado X-Requested-With que indica que la solicitud fue realizada por XMLHttpRequest en lugar de activarse haciendo clic en un hipervínculo regular o un botón de envío de formulario.

Fuente: http://grails-plugins.github.io/grails-spring-security-core/guide/helperClasses.html

Koray Güclü
fuente