web-dev-qa-db-fra.com

En-tête CORS et Origin?

Lorsque nous devons invoquer une requête Ajax, nous faisons:

if(typeof XMLHttpRequest !== 'undefined') xhr = new XMLHttpRequest();
else
{
    var versions = ["Microsoft.XmlHttp",
            "MSXML2.XmlHttp",
            "MSXML2.XmlHttp.3.0",
            "MSXML2.XmlHttp.4.0",
            "MSXML2.XmlHttp.5.0"
    ];

Je sais déjà qu'en utilisant XMLHttpRequest-2, nous pouvons faire une demande d'Origine croisée ET que l'en-tête Origin soit ajouté.

Question:

  • Quand cet en-tête est-il ajouté?

    • Est-il ajouté lorsqu'un navigateur (qui prend en charge CORS) effectue une demande? (inter-domaine ou non-inter-domaine?)
    • Ou est-il ajouté automatiquement lorsque le navigateur "voit" que l'origine cible de la demande est différente de l'origine actuelle ...

Je veux dire: qu'est-ce que le He ** signifie la ligne en gras?

Les requêtes HTTP d'origine croisée ont un en-tête Origin. Cet en-tête fournit au serveur l'origine de la demande. Cet en-tête est protégé par le navigateur et ne peut pas être modifié à partir du code d'application. Il s'agit essentiellement de l'équivalent réseau de la propriété Origin trouvée sur les événements de message utilisés dans la messagerie croisée. L'en-tête Origin diffère de l'ancien en-tête du référent [sic] en ce que le référent est une URL complète incluant le chemin. Étant donné que le chemin peut contenir des informations sensibles, le référent n'est parfois pas envoyé par les navigateurs qui tentent de protéger la confidentialité des utilisateurs. Cependant, le navigateur enverra toujours les en-têtes Origin requis si nécessaire.

29
Royi Namir

L'en-tête Origine

Lorsque cet en-tête est ajouté?

Pendant l'étape d'en-tête, avant l'envoi du corps du document (après open, avant send).

Est-il ajouté lorsqu'un navigateur (qui prend en charge CORS) fait une demande? (inter-domaine ou non-inter-domaine?)

Il est ajouté lorsque l'origine ne correspond pas à la page à partir de laquelle le XMLHttpRequest est créé, mais peut également être envoyé dans une même demande d'origine.

Ou est-il ajouté automatiquement lorsque le navigateur "voit" que l'origine de la demande est différente de l'origine actuelle ...

Oui.

Cependant, le navigateur enverra toujours les en-têtes Origin requis si nécessaire.

Cela fait partie de la spécification XMLHttpRequest; si vous effectuez une demande interdomaine, dans les en-têtes de demande, un en-tête supplémentaire est envoyé. Cet en-tête est par exemple Origin: http://www.stackoverflow.com et est ajouté par un navigateur conforme aux normes sans interaction de l'utilisateur.


Vous pouvez en savoir plus sur la spécification dans Section Sécurité de MozillaWiki , [~ # ~] whatwg [~ # ~] et html5.org . Il est mis en œuvre par (que je sache) FireFox et Google Chrome. Je ne pense pas que cela fasse encore partie du W3C. De plus ne présumez pas que l'en-tête Origin est vrai , car il peut être défini manuellement par des borwsers modifiés ou d'autres logiciels.

45
Paul S.

L'en-tête Origin est ajouté automatiquement (généralement) lorsque vous effectuez une demande interdomaine.

Pour le tester, j'ai ouvert la console sur cette page et j'ai fait deux requêtes différentes: une pour un autre domaine et une pour '/' et juste la première a ajouté l'en-tête Origin.

BTW, j'utilise JQuery pour cela et je vous conseillerais vraiment de l'utiliser aussi afin d'avoir le même comportement cross-browser.

Pour des informations complémentaires sur le sujet, vérifiez ceci:

La première chose à noter est qu'une requête CORS valide contient toujours un en-tête Origin. Cet en-tête Origin est ajouté par le navigateur et ne peut pas être contrôlé par l'utilisateur. La valeur de cet en-tête est le schéma (par exemple http), le domaine (par exemple bob.com) et le port (inclus uniquement s'il ne s'agit pas d'un port par défaut, par exemple 81) d'où provient la demande; par exemple: http://api.alice.com .

La présence de l'en-tête Origin ne signifie pas nécessairement que la requête est une requête cross-Origin. Bien que toutes les demandes d'origine croisée contiennent un en-tête d'origine, certaines demandes d'origine identique peuvent également en avoir un. Par exemple, Firefox n'inclut pas d'en-tête Origin sur les demandes de même origine. Mais Chrome et Safari incluent un en-tête Origin sur les requêtes POST/PUT/DELETE de même origine (les requêtes GET de même origine n'auront pas d'en-tête Origin).

Source

9
Robyflc