web-dev-qa-db-fra.com

Quel est l'intérêt de l'en-tête X-Requested-With?

JQuery et d'autres frameworks ajoutent l'en-tête suivant:

X-Demandé-Avec: XMLHttpRequest

Pourquoi est-ce nécessaire? Pourquoi un serveur voudrait-il traiter les requêtes AJAX différemment des requêtes normales?

UPDATE: Je viens de trouver un exemple concret utilisant cet en-tête: https://core.spreedly.com/manual/ méthodes de paiement/ajout-avec-js . Si le processeur de paiement est demandé sans AJAX, il sera redirigé vers le site Web d'origine à la fin de l'opération. Lorsqu'il est demandé avec AJAX, aucune redirection n'est effectuée.

190
Gili

Une bonne raison est la sécurité - cela peut empêcher les attaques CSRF car cet en-tête ne peut pas être ajouté à la demande AJAX interdomaine sans le consentement du serveur via CORS .

Seuls les en-têtes suivants sont autorisés entre domaines:

  • Acceptez
  • Accepter la langue
  • Contenu-Langue
  • Last-Event-ID
  • Type de contenu

toute autre cause entraîne l'envoi d'une demande "pré-vol" dans les navigateurs pris en charge par CORS.

Sans CORS, il n'est pas possible d'ajouter X-Requested-With à une demande XHR entre domaines.

Si le serveur vérifie que cet en-tête est présent, il sait que la demande n'a pas été initiée depuis le domaine d'un attaquant tentant de faire une demande au nom de l'utilisateur avec JavaScript. Cela vérifie également que la demande n'a pas été POSTée à partir d'un formulaire HTML classique, dont il est plus difficile de vérifier qu'il ne s'agit pas d'un domaine croisé sans l'utilisation de jetons. (Cependant, cocher l'en-tête Origin) pourrait être une option pour les navigateurs pris en charge, vous laisserez toutefois les anciens navigateurs vulnérables .

Nouveau contournement Flash découvert

Vous souhaiterez peut-être combiner cela avec un jeton , car Flash s'exécutant sur Safari sous OSX peut définir cet en-tête s'il existe une étape de redirection . Il semble que il a également fonctionné sur Chrome , mais est maintenant corrigé. Plus de détails ici incluant les différentes versions concernées.

OWASP recommande de combiner ceci avec une vérification de l'origine et du référant :

Cette technique de défense est spécifiquement décrite dans la section 4.3 de la section Défenses robustes pour la falsification de requêtes entre sites. Cependant, des contournements de cette défense utilisant Flash ont été documentés dès 2008 et de nouveau également en 2015 par Mathias Karlsson pour exploiter une faille CSRF dans Vimeo. Mais, nous pensons que l'attaque Flash ne peut pas usurper les en-têtes Origin ou Referer. En les vérifiant tous les deux, nous pensons que cette combinaison de contrôles devrait empêcher le contournement des attaques CSRF par Flash. (NOTE: Si quelqu'un peut confirmer ou infirmer cette idée, merci de nous le signaler afin que nous puissions mettre à jour cet article)

Cependant, pour les raisons déjà évoquées, vérifier l'origine peut être délicat.

Mise à jour

Écrit un article de blog plus détaillé sur CORS, CSRF et X-Requested-With here .

227
SilverlightFox

Assurez-vous de lire la réponse de SilverlightFox. Elle met en évidence une raison plus importante.

La raison en est principalement que si vous connaissez la source d'une demande, vous voudrez peut-être la personnaliser un peu.

Par exemple, disons que votre site Web contient de nombreuses recettes. Et vous utilisez un framework jQuery personnalisé pour faire glisser des recettes dans un conteneur en fonction d'un lien sur lequel elles cliquent. Le lien peut être www.example.com/recipe/Apple_pie

Maintenant, normalement, cela renvoie une page complète, un en-tête, un pied de page, un contenu de recette et des annonces. Mais si quelqu'un navigue sur votre site Web, certaines de ces parties sont déjà chargées. Vous pouvez donc utiliser AJAX pour obtenir la recette sélectionnée par l'utilisateur, mais pour gagner du temps et économiser de la bande passante, ne chargez pas l'en-tête/le pied de page/les annonces.

Maintenant, vous pouvez simplement écrire un point de terminaison secondaire pour les données comme www.example.com/recipe_only/Apple_pie, mais il est plus difficile à gérer et à partager avec d'autres personnes.

Mais il est plus facile de simplement détecter qu'il s'agit d'une requête ajax qui fait la requête et ne renvoie ensuite qu'une partie des données. De cette façon, l'utilisateur gaspille moins de bande passante et le site semble plus réactif.

Les frameworks ajoutent simplement l'en-tête car certains jugeront peut-être utile de savoir quelles requêtes sont ajax et quelles requêtes ne le sont pas. Mais il dépend entièrement du développeur d'utiliser de telles techniques.

C'est en fait un peu similaire à l'en-tête Accept-Language. Un navigateur peut demander un site Web, veuillez me montrer une version russe de ce site sans avoir à insérer/ru/ou similaire dans l'URL.

22
EWit

Certains frameworks utilisent cet en-tête pour détecter les requêtes Xhr, par exemple. Grails Spring Security utilise cet en-tête pour identifier la demande xhr et donner une réponse JSON ou une réponse HTML comme réponse.

La plupart des bibliothèques Ajax (Prototype, JQuery et Dojo à partir de la version 2.1) incluent un en-tête X-Requested-With indiquant que la demande a été effectuée par XMLHttpRequest au lieu d'être déclenchée en cliquant sur un lien hypertexte normal ou sur un bouton d'envoi de formulaire.

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

8
Koray Güclü