100 votes

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

Je dois 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'il commence sur la page http://www.othersite.com/pageA.jsp cliquez sur un lien qui les mène à http://www.example.com/pageB.jsp qui exécute alors une redirection 302 vers http://www.example.com/pageC.jsp J'ai besoin que la chaîne de référence contienne http://www.othersite.com/pageA.jsp

Est-ce le comportement normal pour une redirection 302 ? Ou est-ce que mon référent d'origine sera abandonné au profit de http://www.example.com/pageB.jsp ? Ce n'est pas souhaitable.

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

Je dois mentionner que j'ai fait une expérience avec ceci, et il semble avoir gardé la chaîne de référence originale ( http://www.othersite.com/pageA.jsp ) mais je voulais juste m'assurer que c'était le comportement normal par défaut, et non 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 ?

4 votes

J'ai juste besoin du contraire. Faire une redirection côté serveur en changeant le référent sur la redirection (supprimant ainsi le référent original). Quelqu'un ?

130voto

Marco Demaio Points 8667

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

SCÉNARIO Un utilisateur clique sur un lien sur le domaineX qui pointe vers le domaineA. Le domaineA fait une redirection 301 vers le domaineB.

  • IE8 referer lorsque l'atterrissage sur le domaineB est : domaineX (même en utilisant la navigation privée et même lorsque l'utilisateur ouvre le lien dans un nouvel onglet)
  • Safari4 referer lorsque l'atterrissage sur le domaineB est : domaineX (même si l'utilisateur ouvre le lien dans un nouvel onglet)
  • FF3.6.10 referer lorsque l'atterrissage sur le domaineB est : domaineX (même si l'utilisateur ouvre le lien dans un nouvel onglet)
  • Chrome5 referer lors de l'atterrissage sur le domaine B est : domaine X ( sauf si l'utilisateur ouvre les liens dans un nouvel onglet)
  • Chrome26 referer lorsque l'atterrissage sur le domaineB est : domaineX (même lorsque l'utilisateur ouvre les liens dans un nouvel onglet)

27 votes

Note : ce test a été effectué il y a un certain temps, et aujourd'hui Chrome 26 se comporte de la même manière. même lorsqu'il est ouvert dans un nouvel onglet .

0 votes

Non testé sur tous les navigateurs, mais le comportement pour le 302 semble être identique.

2 votes

Remarque : si la page de redirection (domaineA) émet un message d'erreur Referrer-Policy : no-referrer Chrome (et Opera) ne définira pas l'en-tête Référent sur la requête vers la page de destination (domaineB). Firefox et Edge l'envoient toujours.

36voto

Malcolm Box Points 2427

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

Le mieux est de faire un test avec plusieurs navigateurs et de voir s'il y a un consensus sur le comportement.

Pour une ceinture et des bretelles complètes, encodez le référent d'origine dans l'URL de redirection afin de pouvoir garantir sa récupération.

24 votes

Pour ceux que cela peut intéresser, j'ai fait des tests de spme sur les principaux navigateurs : stackoverflow.com/questions/2158283/

13voto

Pekka 웃 Points 249607

Bonne question. Dans ce cas, l'envoi du référent dépend entièrement du navigateur (car on lui demande d'effectuer une nouvelle requête vers la nouvelle ressource).

RFC 2616 reste silencieux sur la question :

La ressource demandée réside temporairement sous un autre URI. Comme la redirection peut être modifiée à l'occasion, le client DEVRAIT continuer à utiliser l'URI de la 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 rechange

Si vous le pouvez, pourquoi ne pas ajouter un ?override_referer=<old_url> à l'URL vers laquelle vous redirigez, et analyser cette valeur à la place de HTTP_REFERER.

De cette façon, vous êtes sûr d'obtenir toujours le bon résultat, et vous ne perdez rien en sécurité : Le référent peut être falsifié dans les deux cas.

8 votes

Vous perdez en fait quelque chose en matière de sécurité en rendant le référent surchargeable dans l'URL. Dans la plupart des navigateurs modernes, le référent des requêtes AJAX ne peut pas être modifié par JavaScript, mais l'URL peut évidemment l'être. 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 une entrée utilisateur qui ne peut pas être totalement fiable. Mais il est beaucoup plus difficile d'usurper ces données pour quelqu'un d'autre que de modifier l'URL.

9voto

fred727 Points 11

J'ai eu le problème inverse : je voulais que le referer soit "pageB" mais aucun des navigateurs actuels ne procède de cette façon...

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

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

Et le résultat était surprenant :

  • Le référent est la page B avec Chrome
  • Le Referer est VIDE avec FireFox et IE !

J'espère que cela pourra vous aider

0voto

davek Points 12514

Vous pouvez le faire côté serveur. Par exemple, avec Apache, vous pouvez utiliser une fonction Proxy inversé pour atteindre cet objectif :

Un reverse proxy est une passerelle pour serveurs, et permet à un serveur web de de fournir le contenu d'un autre de manière transparente. Comme pour un proxy standard, un reverse proxy peut servir à améliorer les performances du Web en la mise en cache ; il s'agit d'un moyen simple de miroir d'un site Web. L'équilibrage de charge d'une application à forte charge, ou la protection d'une application vulnérable, sont d'autres usages courants. Mais la raison la plus courante pour d'utiliser un reverse proxy est de permettre l'accès contrôlé du Web en général aux serveurs situés derrière un pare-feu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X