Wird eine 302-Umleitung die Referer-Zeichenfolge beibehalten?

92

Ich muss den Benutzer von einer Seite auf eine andere umleiten, aber ich muss die ursprüngliche Verweiszeichenfolge beibehalten. Wenn sie beispielsweise auf http://www.othersite.com/pageA.jsp beginnen , klicken Sie auf einen Link, der sie zu http://www.example.com/pageB.jsp führt , der dann eine 302 ausführt Umleitung zu http://www.example.com/pageC.jsp , muss die Referer-Zeichenfolge enthalten seinhttp://www.othersite.com/pageA.jsp

Ist dies das normale Verhalten für eine 302-Weiterleitung? Oder würde mein ursprünglicher Referer zugunsten von fallen gelassen werden http://www.example.com/pageB.jsp? Das wäre nicht wünschenswert.

Ich weiß nicht, ob es einen Unterschied macht, aber ich arbeite in JSP und verwende es response.sendRedirect(), um die 302-Umleitung auszuführen.

Ich sollte erwähnen, dass ich ein Experiment damit durchgeführt habe und es anscheinend die ursprüngliche Referer-Zeichenfolge ( http://www.othersite.com/pageA.jsp) beibehalten hat, aber ich wollte nur sicherstellen, dass dies das normale Standardverhalten ist und nicht etwas Seltsames an meinem Ende.


Obwohl ich derzeit eine 302-Umleitung verwende, könnte ich wahrscheinlich stattdessen eine 301-Umleitung verwenden. Wissen Sie, ob das Verhalten für 301-Weiterleitungen zuverlässiger ist?

Gelassenheit
quelle
3
Ich brauche nur das Gegenteil. Führen Sie eine serverseitige Umleitung durch, indem Sie den Referrer in der Umleitung ändern (also den ursprünglichen Referrer löschen). Jemand?
Cprcrack

Antworten:

32

Eine kurze Antwort ist, dass sie weder für den Referer-Header noch für den 302-Statuscode im entsprechenden RFC 2616 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.36 angegeben ist .

Am besten führen Sie einen Test mit mehreren Browsern durch und prüfen, ob ein Konsensverhalten vorliegt.

Codieren Sie für vollständige Gürtel und Zahnspangen den ursprünglichen Referrer in der Weiterleitungs-URL, damit Sie garantieren können, dass Sie ihn abrufen.

Malcolm Box
quelle
17
Für wen es interessiert sein könnte, habe ich SPME-Tests auf den wichtigsten Browsern durchgeführt: stackoverflow.com/questions/2158283/…
Marco Demaio
121

Ich weiß nichts über den 302, aber ich habe den 301 heute in einigen Browsern getestet, hier die Ergebnisse:

SZENARIO : Benutzer klickt auf den Link auf domainX, der auf domainA verweist. domainA führt eine 301-Umleitung zu domainB durch.

  • IE8 refererbei der Landung auf Domäne B lautet: DomäneX (auch bei Verwendung von InPrivate-Browsing und selbst wenn der Benutzer den Link in einer neuen Registerkarte öffnet)
  • Safari4 refererbei der Landung auf Domain B lautet: domainX (auch wenn der Benutzer den Link in einem neuen Tab öffnet)
  • FF3.6.10 refererbei der Landung auf Domain B lautet: domainX (auch wenn der Benutzer den Link in einem neuen Tab öffnet)
  • Chrome5 refererbei der Landung auf Domain B lautet: DomainX (es sei denn, der Benutzer öffnet Links in einem neuen Tab)
  • Chrome26 refererbei der Landung auf Domain B lautet: domainX (auch wenn der Benutzer Links in einem neuen Tab öffnet)
Marco Demaio
quelle
27
Hinweis: Dieser Test wurde vor einiger Zeit durchgeführt. Heutzutage verhält sich Chrome 26 auch beim Öffnen in einem neuen Tab genauso .
Benjamin
Nicht in allen Browsern getestet, aber das Verhalten für 302 scheint identisch zu sein.
Amir Ali Akbari
Hinweis: Wenn die Umleitungsseite (domainA) einen Referrer-Policy: no-referrer- Header ausgibt , setzt Chrome (und Opera) den Referer- Header bei der Anforderung nicht auf die Zielseite (domainB). Firefox und Edge senden es weiterhin.
David Balažic
12

Gute Frage. In diesem Fall hängt das Senden des Referers vollständig vom Browser ab (da der Browser angewiesen wird, eine weitere Anforderung an die neue Ressource zu stellen).

RFC 2616 schweigt zu dem Problem:

Die angeforderte Ressource befindet sich vorübergehend unter einem anderen URI. Da die Umleitung gelegentlich geändert werden kann, sollte der Client den Anforderungs-URI weiterhin für zukünftige Anforderungen verwenden. Diese Antwort kann nur zwischengespeichert werden, wenn dies durch ein Cache-Control- oder Expires-Headerfeld angezeigt wird.

Ich würde dem Browser nicht vertrauen, dass er den richtigen Referer mitschickt. Ich wette, es gibt mindestens einen, der etwas anderes sendet als die anderen.

Problemumgehung

Wenn Sie können, fügen ?override_referer=<old_url>Sie der URL, zu der Sie umleiten, einen Parameter hinzu und analysieren Sie diesen Wert anstelle von HTTP_REFERER.

Auf diese Weise können Sie sicher sein, immer das richtige Ergebnis zu erzielen, und Sie verlieren nichts an Sicherheit: Der Referer kann in beiden Fällen gefälscht werden.

Pekka
quelle
4
Sie verlieren tatsächlich etwas an Sicherheit, indem Sie den Referer in der URL überschreibbar machen. In den meisten modernen Browsern kann der Referer für AJAX-Anforderungen nicht über JavaScript geändert werden. Die URL kann dies jedoch offensichtlich. Dies bedeutet, dass der Verweis im Falle eines XSS-Angriffs vertrauenswürdiger ist als der URL-Parameter. Versteh mich nicht falsch, der Referer ist immer noch eindeutig eine Benutzereingabe, der nicht vollständig vertraut werden kann. Es ist jedoch viel schwieriger, diese Daten für eine andere Person zu fälschen, als die URL zu ändern.
Phylae
6

Ich hatte das entgegengesetzte Problem: Ich wollte, dass der Referer "pageB" ist, aber keiner der aktuellen Browser verfahren so ...

Also habe ich es mit einer HTML-Umleitung auf Seite B versucht (anstelle der 301- oder 302-Umleitung):

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

Und das Ergebnis war überraschend:

  • Referer ist Seite B mit Chrome
  • Referer ist leer mit FireFox & IE!

Hoffe das kann helfen

fred727
quelle