web-dev-qa-db-fra.com

Quand les navigateurs envoient-ils l'en-tête Origin? Quand les navigateurs définissent-ils l'origine sur null?

Comme vous pouvez le voir sur ce fil Bugzilla (et aussi ), Firefox n'envoie pas toujours un en-tête Origin dans les requêtes POST. - Le RFC indique qu'il ne doit pas être envoyé dans certains contextes "sensibles à la vie privée" non définis. Mozilla définit ces contextes ici .

Je voudrais savoir si ce sont les seules situations dans lesquelles Firefox n'enverra pas l'en-tête Origin. Pour autant que je sache, il ne l'enverra pas non plus en cross-Origin POST requêtes (bien que Chrome et Internet Explorer le feront), mais je peux ' t confirmez cela dans la documentation. Est-il énuméré quelque part qui me manque?

14
P Jones

En ce qui concerne les exigences des spécifications, la question ci-dessus doit être divisée en deux réponses:

  • Quand les navigateurs doivent envoyer l'en-tête Origin
  • Lorsque les navigateurs doivent définir en interne Origin sur une valeur qui sera sérialisée en null

Je doute que ce que Firefox exige à ce sujet (où il est différent de la spécification) soit énuméré. Mais en ce qui concerne l'énumération des exigences spec, les voici en détail, en deux parties:

Quand les navigateurs doivent envoyer l'en-tête Origin

La réponse à la question Quand les navigateurs doivent-ils envoyer l'en-tête Origin? est: L'en-tête Origin est envoyé uniquement pour toute demande que la spécification Fetch définit comme --- Demande CORS :

Une demande CORS est une demande HTTP qui inclut un en-tête Origin. Il ne peut pas être identifié de manière fiable comme participant au protocole CORS car l'en-tête Origin est également inclus pour toutes les demandes dont la méthode n'est ni GET ni HEAD.

instruction réelle dans la spécification Fetch qui oblige les navigateurs à envoyer l'en-tête Origin pour toutes les demandes dont la méthode n'est ni GET ni HEAD est la suivante:

Si le drapeau CORS est défini ou la méthode httpRequest n'est ni GET ni HEAD, alors ajoutez Origin/ httpRequest Origine, sérialisée et codée UTF-8, dans la liste d'en-tête de httpRequest.

Cela nécessite donc que les navigateurs envoient Origin pour les demandes toutesPOST, y compris les demandes de même origine POST (qui par définition dans Fetch sont en fait "Demandes CORS" - même si elles sont de même origine).


Remarque: Ce qui précède décrit comment la spécification Fetch définit actuellement les exigences, en raison d'un modification apportée à la spécification le 2016-12 -09 . Jusque-là, les exigences étaient différentes:

  • auparavant, aucun Origin n'était envoyé pour un POST de même origine
  • auparavant, aucun Origin n'était envoyé pour l'origine croisée POST à partir d'un <form> (sans CORS)

Je pense donc que le comportement de Firefox décrit dans la question est conforme à ce que la spécification auparavant est requise, mais pas à ce que la spécification actuellement requiert.


Les autres cas où les navigateurs doivent envoyer l'en-tête Origin sont tous les cas où une demande est effectuée avec le jeu "indicateur CORS" - qui, dans la mesure où les demandes HTTP (S) sont sauf lorsque le mode de demande est navigate, websocket, same-Origin, ou no-cors .

XHR toujours définit le mode sur cors. Mais avec l'API Fetch, ces modes de demande sont ceux que vous pouvez définir avec le champ mode de l'argument init-object de la méthode fetch(…):

fetch("http://example.com", { mode: 'no-cors' }) // no Origin will be sent

Parallèlement à cela, pour tout élément avec n attribut crossorigin ( aka "Attribut de réglage CORS), la spécification HTML nécessite que les navigateurs définissent le mode de demande vers cors (et pour envoyer l'en-tête Origin).

Sinon, pour tous les éléments ayant des attributs avec des URL qui lancent des demandes (<script src>, Feuilles de style, images, éléments multimédias), le mode des demandes par défaut est no-cors, Ce qui signifie non Origin l'en-tête est envoyé pour eux.

Donc, ci-dessus sont les détails sur les conditions dans lesquelles les navigateurs envoient l'en-tête Origin.

La partie suivante de la réponse concerne le moment où la valeur d'origine sera définie sur null.

Lorsque les navigateurs doivent définir Origin sur une valeur qui sera sérialisée en tant que null

Les exigences relatives au moment où les navigateurs doivent envoyer l'en-tête Origin sont distinctes des exigences lorsque les navigateurs doivent définir une origine sur null, définies dans les spécifications suivantes:

La spécification HTML utilise le terme origine opaque et dit ceci:

Une valeur interne, sans sérialisation à partir de laquelle elle peut être recréée (elle est sérialisée en tant que "null" par ASCII sérialisation d'une origine), pour laquelle la seule opération significative teste l'égalité.

En d'autres termes, partout où la spécification HTML indique Origine opaque, vous pouvez traduire cela en null.

La spécification HTML nécessite que les navigateurs définissent une origine opaque ou une origine unique dans les cas suivants:

  1. Images d'origine croisée (y compris les éléments d'origine croisée img)
  2. données multimédias d'origine croisée (y compris les éléments d'origine croisée video et audio)
  3. Tout document généré à partir d'une URL data:
  4. Tout iframe avec un attribut sandbox qui ne contient pas la valeur allow-same-Origin
  5. Tout document créé par programme à l'aide de createDocument(), etc.
  6. Tout document qui n'a pas de contexte de navigation de créateur
  7. Réponses qui sont des erreurs de résea
  8. La réponse de navigation à la demande de navigation de type source dans la cible doit-elle être bloquée par la politique de sécurité du contenu? l'algorithme renvoie Bloqué lorsqu'il est exécuté sur une réponse de navigation

La spécification Fetch nécessite que les navigateurs définissent l'origine sur un "identifiant globalement unique" (ce qui signifie essentiellement la même chose que "origine opaque" qui signifie essentiellement null…) dans un cas:

  1. redirige entre les origines

La spécification d'URL nécessite que les navigateurs définissent une origine opaque dans les cas suivants:

  1. Pour les URL blob:
  2. Pour les URL file:
  3. pour toute autre URL dont le schéma n'est pas l'un de http, https, ftp, ws, wss, ou Gopher .

Mais il est important de comprendre que le simple fait que le navigateur ait défini en interne une origine opaque - essentiellement null - ne signifie pas nécessairement que le navigateur enverra un en-tête Origin. Consultez donc la première partie de cette réponse pour savoir quand les navigateurs doivent envoyer l'en-tête Origin.

33
sideshowbarker