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?
En ce qui concerne les exigences des spécifications, la question ci-dessus doit être divisée en deux réponses:
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:
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êteOrigin
est également inclus pour toutes les demandes dont la méthode n'est niGET
niHEAD
.
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
niHEAD
, alors ajoutezOrigin
/ 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:
Origin
n'était envoyé pour un POST de même origineOrigin
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
.
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:
img
)video
et audio
)data:
iframe
avec un attribut sandbox
qui ne contient pas la valeur allow-same-Origin
createDocument()
, etc.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:
La spécification d'URL nécessite que les navigateurs définissent une origine opaque dans les cas suivants:
blob:
file:
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
.