Czy przekierowanie 302 zachowa ciąg referencyjny?

92

Muszę przekierować użytkownika z jednej strony na drugą, ale muszę zachować oryginalny ciąg referencyjny. Na przykład, jeśli zaczynają na http://www.othersite.com/pageA.jsp , kliknij łącze, które prowadzi ich do http://www.example.com/pageB.jsp , a następnie wykonuje 302 przekierowanie do http://www.example.com/pageC.jsp , potrzebuję, aby zawierał ciąg referencyjnyhttp://www.othersite.com/pageA.jsp

Czy jest to normalne zachowanie w przypadku przekierowania 302? A może mój pierwotny referendarz zostałby usunięty na korzyść http://www.example.com/pageB.jsp? To nie byłoby pożądane.

Nie wiem, czy to robi jakąkolwiek różnicę, ale pracuję w JSP i używam response.sendRedirect()do wykonania przekierowania 302.

Powinienem wspomnieć, że przeprowadziłem z tym eksperyment i wydaje się, że zachowałem oryginalny ciąg referencyjny ( http://www.othersite.com/pageA.jsp), ale chciałem się tylko upewnić, że jest to normalne domyślne zachowanie, a nie coś dziwnego z mojej strony.


Chociaż obecnie używam przekierowania 302, prawdopodobnie mógłbym zamiast tego użyć przekierowania 301. Czy wiesz, czy zachowanie przekierowań 301 jest bardziej niezawodne?

sangfroid
źródło
3
Po prostu potrzebuję czegoś przeciwnego. Wykonaj przekierowanie po stronie serwera, zmieniając stronę odsyłającą w przekierowaniu (a więc usuwając pierwotną stronę odsyłającą). Ktoś?
cprcrack

Odpowiedzi:

32

Krótka odpowiedź brzmi: nie podano jej w odpowiednim dokumencie RFC 2616 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.36 ani w nagłówku Referer, ani w kodzie stanu 302.

Najlepszym rozwiązaniem jest wykonanie testu z kilkoma przeglądarkami i sprawdzenie, czy istnieje konsensus.

W przypadku pełnego paska i szelek zakoduj oryginalny odsyłacz w adresie URL przekierowania, aby zagwarantować jego odzyskanie.

Malcolm Box
źródło
19
Dla kogo może być zainteresowany, zrobiłem testy spme na głównych przeglądarkach: stackoverflow.com/questions/2158283/ ...
Marco Demaio
121

Nie wiem o 302, ale testowałem 301 na niektórych przeglądarkach dzisiaj, oto wyniki:

SCENARIUSZ : użytkownik klika link w domenieX, który wskazuje na domenęA. domena A wykonuje przekierowanie 301 do domeny B.

  • IE8 refererpodczas lądowania na domenie B to: domainX (nawet podczas przeglądania InPrivate, a nawet gdy użytkownik otworzy link w nowej karcie)
  • Safari4 refererpodczas lądowania na domenie B to: domenaX (nawet gdy użytkownik otworzy link w nowej karcie)
  • FF3.6.10 referer podczas lądowania na domenie B to: domenaX (nawet jeśli użytkownik otworzy link w nowej karcie)
  • Chrome5 refererpo wylądowaniu na domenie B to: domenaX ( chyba że użytkownik otworzy linki w nowej karcie)
  • Chrome26 refererpodczas lądowania na domenie B to: domenaX (nawet jeśli użytkownik otworzy linki w nowej karcie)
Marco Demaio
źródło
27
Uwaga: ten test został przeprowadzony jakiś czas temu, a obecnie Chrome 26 zachowuje się tak samo, nawet po otwarciu w nowej karcie .
Benjamin
Nie testowano na wszystkich przeglądarkach, ale zachowanie dla 302 wydaje się być identyczne.
Amir Ali Akbari
1
Uwaga: jeśli strona przekierowująca (domenaA) wystawi nagłówek Referrer -Policy: no-referrer , to Chrome (i Opera) nie ustawią nagłówka Referer w żądaniu strony docelowej (domenaB). Firefox i Edge nadal to wysyłają.
David Balažic
12

Dobre pytanie. W takim przypadku wysłanie osoby odsyłającej zależy całkowicie od przeglądarki (ponieważ przeglądarka jest proszona o wysłanie kolejnego żądania do nowego zasobu).

RFC 2616 milczy na temat problemu:

Żądany zasób znajduje się tymczasowo pod innym identyfikatorem URI. Ponieważ przekierowanie może być czasami zmieniane, klient POWINIEN nadal używać identyfikatora URI żądania dla przyszłych żądań. Ta odpowiedź może być buforowana tylko wtedy, gdy jest to wskazane w polu nagłówka Cache-Control lub Expires.

Nie ufałbym przeglądarce, że wyśle ​​ze sobą właściwego recenzenta. Założę się, że jest przynajmniej jeden, który wysyła coś innego niż inne.

Obejście problemu

Jeśli możesz, dlaczego nie dodać ?override_referer=<old_url>parametru do adresu URL, do którego przekierowujesz, i przeanalizować tę wartość zamiast HTTP_REFERER.

W ten sposób możesz mieć pewność, że zawsze uzyskasz właściwy wynik i nic nie stracisz na bezpieczeństwie: sędzia może zostać sfałszowany.

Pekka
źródło
4
W rzeczywistości tracisz coś na bezpieczeństwie, powodując zastąpienie odniesienia w adresie URL. W większości nowoczesnych przeglądarek referencyjnych dla żądań AJAX nie można zmienić za pomocą JavaScript; jednak adres URL oczywiście tak. Oznacza to, że w przypadku ataku XSS referer jest bardziej godny zaufania niż parametr adresu URL. Nie zrozumcie mnie źle, osoba odsyłająca nadal wyraźnie wskazuje dane wejściowe użytkownika, którym nie można całkowicie ufać. Jednak znacznie trudniej jest sfałszować te dane komuś innemu niż zmienić adres URL.
gromady
7

Miałem inny problem: chciałem, żeby recenzentem była „stronaB”, ale żadna z obecnych przeglądarek nie działa w ten sposób ...

Próbowałem więc z przekierowaniem HTML na stronie B (zamiast przekierowania 301 lub 302):

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

Wynik był zaskakujący:

  • Odsyłacz to strona B w Chrome
  • Referer jest PUSTY z FireFox i IE!

Mam nadzieję, że to pomoże

fred727
źródło