Une redirection 302 conservera-t-elle la chaîne de référence?

92

J'ai besoin de rediriger l'utilisateur d'une page à une autre, mais je dois conserver la chaîne de référence d'origine. Ainsi, par exemple, s'ils commencent sur http://www.othersite.com/pageA.jsp , cliquez sur un lien qui les mène à http://www.example.com/pageB.jsp , qui exécute ensuite un 302 rediriger vers http://www.example.com/pageC.jsp , j'ai besoin que la chaîne de référence contiennehttp://www.othersite.com/pageA.jsp

Est-ce le comportement normal pour une redirection 302? Ou mon référent d'origine serait-il abandonné, en faveur de http://www.example.com/pageB.jsp? Ce ne serait pas souhaitable.

Je ne sais pas si cela fait une différence, mais je travaille dans JSP et j'utilise response.sendRedirect()pour exécuter la redirection 302.

Je devrais mentionner que j'ai fait une expérience avec cela, et qu'il semble avoir conservé la chaîne de référence d'origine ( http://www.othersite.com/pageA.jsp) mais je voulais juste m'assurer que c'était le comportement par défaut normal, et pas quelque chose de bizarre de mon côté.


Bien que j'utilise actuellement une redirection 302, je pourrais probablement utiliser une redirection 301 à la place. Savez-vous si le comportement des redirections 301 est plus fiable?

sang-froid
la source
3
J'ai juste besoin du contraire. Faites une redirection côté serveur en modifiant le référent sur la redirection (supprimant ainsi le référent d'origine). N'importe qui?
cprcrack

Réponses:

32

La réponse courte est que ce n'est pas spécifié dans la RFC 2616 pertinente http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.36 que ce soit pour l'en-tête Referer ou le code d'état 302.

Votre meilleur pari est de faire un test avec plusieurs navigateurs et de voir s'il existe un comportement consensuel.

Pour une ceinture complète et des accolades, encodez le référent d'origine dans l'URL de redirection afin que vous puissiez garantir de le récupérer.

Boîte Malcolm
la source
19
À qui cela peut être intéressé, j'ai fait des tests spme sur les principaux navigateurs: stackoverflow.com/questions/2158283/…
Marco Demaio
121

Je ne sais pas pour le 302, mais j'ai testé le 301 sur certains navigateurs aujourd'hui, voici les résultats:

SCÉNARIO : l'utilisateur clique sur le lien sur domainX qui pointe vers domainA. domainA effectue une redirection 301 vers domainB.

  • IE8 refererlors de l'atterrissage sur domainB est: domainX (même lors de l'utilisation de la navigation InPrivate et même lorsque l'utilisateur ouvre le lien dans un nouvel onglet)
  • Safari4 refererlors de l'atterrissage sur domainB est: domainX (même lorsque l'utilisateur ouvre le lien dans un nouvel onglet)
  • FF3.6.10 refererlors de l'atterrissage sur domainB est: domainX (même lorsque l'utilisateur ouvre le lien dans un nouvel onglet)
  • Chrome5 refererlors de l'atterrissage sur domainB est: domainX ( sauf si l' utilisateur ouvre des liens dans un nouvel onglet)
  • Chrome26 refererlors de l'atterrissage sur domainB est: domainX (même lorsque l'utilisateur ouvre des liens dans un nouvel onglet)
Marco Demaio
la source
27
Remarque: ce test a été effectué il y a quelque temps et de nos jours, Chrome 26 se comporte de la même manière même lorsqu'il est ouvert dans un nouvel onglet .
Benjamin
Non testé sur tous les navigateurs, mais le comportement de 302 semble être identique.
Amir Ali Akbari
1
Remarque: si la page de redirection (domainA) émet un en - tête Referrer-Policy: no-referrer , Chrome (et Opera) ne définiront pas l'en- tête Referer sur la demande à la page de destination (domainB). Firefox et Edge l'envoient toujours.
David Balažic
12

Bonne question. Dans ce cas, l'envoi du référent dépend entièrement du navigateur (car le navigateur est invité à faire une autre requête à la nouvelle ressource).

RFC 2616 reste silencieux sur le problème:

La ressource demandée réside temporairement sous un URI différent. Puisque la redirection peut être modifiée à l'occasion, le client DEVRAIT continuer à utiliser l'URI de demande pour les demandes futures. Cette réponse ne peut être mise en cache que si elle est indiquée par un champ d'en-tête Cache-Control ou Expires.

Je ne ferais pas confiance au navigateur pour envoyer le bon référent. Je parie qu'il y en a au moins un qui envoie quelque chose de différent des autres.

solution de contournement

Si vous le pouvez, pourquoi ne pas ajouter un ?override_referer=<old_url>paramètre à l'URL vers laquelle vous redirigez et analysez cette valeur au lieu de HTTP_REFERER.

De cette façon, vous pouvez être sûr d'obtenir toujours le bon résultat, et vous ne perdez rien en sécurité: le référent peut être simulé de toute façon.

Pekka
la source
4
Vous perdez en fait quelque chose de sécurité en rendant le référent remplaçable dans l'URL. Dans la plupart des navigateurs modernes, le référent des requêtes AJAX ne peut pas être modifié via JavaScript; cependant, l'URL le peut évidemment. Cela signifie qu'en cas d'attaque XSS, le référent est plus fiable que le paramètre URL. Ne vous méprenez pas, le référent est toujours clairement l'entrée de l'utilisateur qui ne peut pas être entièrement fiable. Mais il est beaucoup plus difficile d'usurper ces données pour quelqu'un d'autre que de changer l'URL.
phylae
7

J'ai eu le problème opposé: je voulais que ce référent soit "pageB" mais aucun des navigateurs actuels ne procédait de cette façon ...

J'ai donc essayé avec une redirection HTML sur pageB (au lieu de redirection 301 ou 302):

<meta http-equiv="refresh" content="0; url=pageC.jsp" />

Et le résultat était surprenant:

  • Le référent est pageB avec Chrome
  • Referer est VIDE avec FireFox & IE!

J'espère que cela peut aider

fred727
la source