Les préoccupations de différence redirigeant POST
, PUT
et les DELETE
demandes et les attentes du serveur sont pour le comportement de l' agent utilisateur ( RFC 2616
):
Remarque: RFC 1945 et RFC 2068 spécifient que le client n'est pas autorisé à modifier la méthode sur la demande redirigée. Cependant, la plupart des implémentations d'agent utilisateur existantes traitent 302 comme s'il s'agissait d'une réponse 303, effectuant un GET sur la valeur de champ Location quelle que soit la méthode de demande d'origine. Les codes d'état 303 et 307 ont été ajoutés pour les serveurs qui souhaitent clarifier sans ambiguïté le type de réaction attendu du client.
Lisez également l'article Wikipedia sur les codes de redirection 30x .
307 est dû au fait que les agents utilisateurs ont adopté un comportement de facto pour accepter les demandes POST qui reçoivent une réponse 302 et envoyer une demande GET à l'en-tête de réponse Emplacement.
C'est le comportement incorrect - seul un 303 devrait faire en sorte qu'un POST se transforme en GET. Les agents utilisateurs doivent (mais ne respectent pas) la méthode POST lors de la demande de la nouvelle URL si la demande POST d'origine a renvoyé un 302.
307 a été introduit pour permettre aux serveurs d'indiquer clairement à l'agent utilisateur qu'un changement de méthode ne doit pas être effectué par le client lorsqu'il suit l'en-tête de réponse Emplacement.
la source
302
correctement. Chrome 30, IE10. C'est devenu la mise en œuvre de facto incorrecte; cela ne peut pas être modifié car de nombreux sites Web émettent par erreur le problème 302. En fait, ASP.net MVC émet de manière incorrecte 302, selon le fait que les navigateurs le traitent incorrectement.303
a également été introduit307
dans la spécification HTTP 1.1 et permet donc une compatibilité descendante avec les agents utilisateurs HTTP 1.0. Bien sûr, la vraie question est de savoir si nous devons encore gérer les agents utilisateurs HTTP 1.0?Response.RedirectSeeOther
), et si le client n'est pas 1.1 (par exemple )GET /foo.html
,GET /foo.html HTTP/1.0
émettez l'héritage302
.Un bon exemple de l'
307 Internal Redirect
action est lorsque Google Chrome rencontre un appel HTTP vers un domaine qu'il sait comme nécessitant une sécurité de transport stricte.Le navigateur redirige de manière transparente, en utilisant la même méthode que l'appel d'origine.
la source
Exemple d'utilisation: URL déplacée de
/register-form.html
verssignup-form.html
.La méthode passera à GET, conformément à la RFC 7231: "Pour des raisons historiques, un agent utilisateur PEUT changer la méthode de demande de POST à GET pour la demande suivante."
Exemple d'utilisation: si le navigateur a envoyé POST à
/register.php
, chargez maintenant (GET)/success.html
.Exemple d'utilisation: si le navigateur a envoyé un POST à
/register.php
, cela lui indique de refaire le POST à/signup.php
.La RFC 7231 (de 2014) est très lisible et pas trop verbeuse. Si vous voulez connaître la réponse exacte, c'est une lecture recommandée. Certaines autres réponses utilisent la RFC 2616 de 1999, mais rien n'a changé.
La RFC 7238 spécifie l'état 308. Il est considéré comme expérimental, mais il était déjà pris en charge par tous les principaux navigateurs en 2016.
la source
ATTENDU pour 302: la redirection utilise la même méthode de demande POST sur NEW_URL
ACTUAL pour 302, 303: rediriger la méthode de demande de changement de POST vers GET sur NEW_URL
ACTUAL pour 307: la redirection utilise la même méthode de requête POST sur NEW_URL
la source
302 est une redirection temporaire, qui est générée par le serveur tandis que 307 est une réponse de redirection interne générée par le navigateur. La redirection interne signifie que la redirection est effectuée automatiquement par le navigateur en interne, fondamentalement, le navigateur modifie l'URL entrée de http à https dans la demande get par lui-même avant de faire la demande, de sorte que la demande de connexion non sécurisée n'est jamais effectuée sur Internet. Le fait que le navigateur modifie ou non l'URL en https dépend de la liste de préchargement hsts préinstallée avec le navigateur. Vous pouvez également ajouter n'importe quel site prenant en charge https à la liste en entrant le domaine dans la liste de préchargement hsts de votre propre navigateur qui se trouve sur chrome: //net-internals/#hsts.Une autre chose que les domaines de sites Web peuvent être ajoutés par leurs propriétaires pour précharger la liste en remplissant le formulaire sur https://hstspreload.org/afin qu'il soit préinstallé dans les navigateurs pour chaque utilisateur, même si je mentionne que vous pouvez également le faire pour vous-même.
Je m'explique avec un exemple:
j'ai fait une demande get à http://www.pentesteracademy.com qui ne prend en charge que https et je n'ai pas ce domaine dans ma liste de préchargement hsts sur mon navigateur car le propriétaire du site ne s'est pas enregistré pour cela à venir avec une liste de préchargement hsts préinstallée. La demande GET pour une version non sécurisée du site est redirigée vers une version sécurisée (voir l'en-tête http nommé emplacement pour cela en réponse dans l'image ci-dessus). Maintenant, j'ajoute le site à ma propre liste de préchargement du navigateur en ajoutant son domaine sous la forme Ajouter un domaine hsts sur chrome: // net-internals / # hsts, ce qui modifie ma liste de préchargement personnelle sur mon navigateur chrome.Veillez à sélectionner les sous-domaines pour Option STS là-bas. Voyons maintenant la demande et la réponse pour le même site Web après l'avoir ajouté à la liste de préchargement hsts.
vous pouvez voir la redirection interne 307 dans les en-têtes de réponse, en fait cette réponse est générée par votre navigateur et non par le serveur.
La liste de préchargement HSTS peut également empêcher les utilisateurs d'accéder à la version non sécurisée du site, car la redirection 302 est sujette aux attaques mitm.
J'espère que je vous ai un peu aidé à mieux comprendre les redirections.
la source
À l'origine, il y avait juste
302
L'idée est que:
GET
à un endroit, vous referiez votreGET
à la nouvelle URLPOST
à un endroit, vous referiez votrePOST
à la nouvelle URLPUT
à un endroit, vous referiez votrePUT
à la nouvelle URLDELETE
à un endroit, vous referiez votreDELETE
à la nouvelle URLMalheureusement, tous les navigateurs l'ont mal fait. Lors de l'obtention d'un
302
, ils basculeraient toujours versGET
la nouvelle URL, plutôt que de réessayer la demande avec le même verbe ( par exemple ,POST
):C'est devenu de facto faux.
Tous les navigateurs se sont
302
trompés. Ainsi303
et307
ont été créés.| Réponse | Ce que les navigateurs doivent faire | Ce que les navigateurs font réellement | | ------------------------ | ------------------------ --- | --------------------------- | | 302 trouvés | Refaire la demande avec une nouvelle URL | OBTENIR avec une nouvelle URL | | 303 Voir autre | OBTENIR avec une nouvelle URL | OBTENIR avec une nouvelle URL | | 307 Redirection temporaire | Refaire la demande avec une nouvelle URL | Refaire la demande avec une nouvelle URL |
Sous forme de graphique
Les 5 différents types de redirections:
Alternativement:
la source
En outre, pour les administrateurs de serveur, il peut être important de noter que les navigateurs peuvent présenter une invite à l'utilisateur si vous utilisez la redirection 307.
Par exemple *, Firefox et Opera demanderaient à l'utilisateur l'autorisation de rediriger, tandis que Chrome, IE et Safari feraient la redirection de manière transparente.
* selon SSL et TLS Bulletproof (page 192).
la source
Dans certains cas d'utilisation, 307 redirections peuvent être utilisées abusivement par un attaquant pour connaître les informations d'identification de la victime.
Pour plus d'informations, reportez-vous à la section 3.1 d' une analyse de sécurité formelle complète d'OAuth 2.0 .
Les auteurs de l'article ci-dessus suggèrent ce qui suit:
la source