¿Cuál es el punto del encabezado X-Requerido-Con?

JQuery y otros marcos agregan el siguiente encabezado:

X-Requerido-Con: XMLHttpRequest

¿Por qué es esto necesario? ¿Por qué un servidor desea tratar las solicitudes AJAX de forma diferente a las solicitudes normales?

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

Una buena razón es para la seguridad: esto puede evitar los 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:

  • Aceptar
  • Aceptar Idioma
  • Contenido-Lenguaje
  • ID del último evento
  • Tipo de contenido

otros hacen que se emita una solicitud de “pre-vuelo” en navegadores compatibles con CORS.

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

Si el servidor está comprobando que este encabezado está presente, sabe que la solicitud no se inició desde el dominio del atacante que intenta realizar una solicitud en nombre del usuario con JavaScript. Esto también comprueba que la solicitud no se PUBLIQUE desde un formulario HTML regular, de lo cual es más difícil verificar que no sea de dominio cruzado sin el uso de tokens. (Sin embargo, verificar el encabezado de Origin podría ser una opción en los navegadores compatibles, aunque dejará vulnerables a navegadores antiguos ).

Se descubrió un nuevo desvío de Flash

Es posible que desee combinar esto con un token , porque la ejecución de Flash en Safari en OSX puede establecer este encabezado si hay un paso de redirección . Parece que también funcionó en Chrome , pero ahora se remedia. Más detalles aquí incluyendo diferentes versiones afectadas.

OWASP recomienda combinar esto con un cheque de Origen y Referente :

Esta técnica de defensa se trata específicamente en la sección 4.3 de Defensas robustas para la falsificación de solicitudes entre sitios. Sin embargo, bypass de esta defensa utilizando Flash fueron documentados ya en 2008 y nuevamente en 2015 por Mathias Karlsson para explotar un error de CSRF en Vimeo. Sin embargo, creemos que el ataque Flash no puede falsificar los encabezados Origin o Referer, por lo que si los comprobamos, creemos que esta combinación de controles evitará Flash bypass en los ataques CSRF. (NOTA: si alguien puede confirmar o refutar esta creencia, avísenos para que podamos actualizar este artículo)

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

Actualizar

Escrito una publicación de blog más profunda en CORS, CSRF y X-Solicitado-Con aquí .

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

El motivo principal es que, si conoce el origen de una solicitud, puede personalizarla un poco.

Por ejemplo, digamos que tienes un sitio web que tiene muchas recetas. Y utiliza un marco jQuery personalizado para deslizar las recetas en un contenedor según el enlace en el que hacen clic. El enlace puede ser www.example.com/recipe/apple_pie

Ahora normalmente eso devuelve una página completa, encabezado, pie de página, contenido de receta y anuncios. Pero si alguien está navegando en su sitio web, algunas de esas partes ya están cargadas. Entonces 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 como www.example.com/recipe_only/apple_pie pero 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 esta forma, el usuario desperdicia menos ancho de banda y el sitio parece tener más capacidad de respuesta.

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

En realidad, es similar al encabezado Accept-Language . Un navegador puede solicitar un sitio web, por favor muéstreme una versión rusa de este sitio web sin tener que insertar / ru / similar en la URL.

Algunos frameworks están usando este encabezado para detectar solicitudes xhr, por ejemplo, la seguridad de spring de grial está usando este encabezado para identificar la solicitud xhr y da como respuesta una respuesta json o respuesta html.

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

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