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.
jquery
ajax
http-headers
cors
Gili
fuente
fuente
Respuestas:
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:
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-With
a 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
Origin
encabezado 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 :
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í .
fuente
X-Requested-With
encabezado?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 ser
www.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_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 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-Language
encabezado. 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.fuente
Accept
encabezado. Usar un encabezado personalizado para esto suena como el camino equivocado.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.
Fuente: http://grails-plugins.github.io/grails-spring-security-core/guide/helperClasses.html
fuente