Jaka jest różnica między odpowiedzią 302 FOUND
a a 307 TEMPORARY REDIRECT
odpowiedzią HTTP?
Specyfikacja W3 wydaje się wskazywać, że oba są używane do tymczasowych przekierowań i nie można ich buforować, chyba że reakcja na to wyraźnie zezwala.
Jaka jest różnica między odpowiedzią 302 FOUND
a a 307 TEMPORARY REDIRECT
odpowiedzią HTTP?
Specyfikacja W3 wydaje się wskazywać, że oba są używane do tymczasowych przekierowań i nie można ich buforować, chyba że reakcja na to wyraźnie zezwala.
Różnica dotyczy przekierowujące POST
, PUT
oraz DELETE
wnioski i jakie oczekiwania serwera są za zachowanie agenta użytkownika ( RFC 2616
):
Uwaga: RFC 1945 i RFC 2068 określają, że klient nie może zmieniać metody przekierowanego żądania. Jednak większość istniejących implementacji agenta użytkownika traktuje 302 tak, jakby była odpowiedzią 303, wykonując GET na wartości pola Lokalizacja niezależnie od oryginalnej metody żądania. Kody stanu 303 i 307 zostały dodane dla serwerów, które chcą jednoznacznie wyjaśnić, jakiego rodzaju reakcji oczekuje się od klienta.
Przeczytaj także artykuł w Wikipedii na temat 30- krotnych kodów przekierowań .
307 powstało, ponieważ agenty użytkownika przyjęły jako de facto zachowanie przyjmujące żądania POST, które otrzymują odpowiedź 302 i wysyłają żądanie GET do nagłówka odpowiedzi lokalizacji.
To jest nieprawidłowe zachowanie - tylko 303 powinno spowodować, że test POST zmieni się w GET. Agenty użytkownika powinny (ale nie muszą) trzymać się metody POST, gdy żądają nowego adresu URL, jeśli pierwotne żądanie POST zwróciło wartość 302.
Wprowadzono 307, aby umożliwić serwerom wyjaśnienie agentowi użytkownika, że klient nie powinien dokonywać zmian metody podczas podążania za nagłówkiem odpowiedzi Lokalizacja.
źródło
302
nieprawidłową obsługę . Chrome 30, IE10. Stało się de facto nieprawidłową implementacją; nie można tego zmienić, ponieważ tak wiele witryn wydaje błąd omyłkowo 302. W rzeczywistości ASP.net MVC niepoprawnie wydaje 302, w zależności od tego, że przeglądarki nieprawidłowo go obsługują.303
wprowadzono je również307
w specyfikacji HTTP 1.1, a zatem umożliwia zgodność wsteczną z agentami użytkownika HTTP 1.0. Oczywiście, prawdziwe pytanie brzmi: czy nadal powinniśmy w ogóle obsługiwać programy klienckie HTTP 1.0?Response.RedirectSeeOther
), a jeśli klient nie jest w wersji 1.1 (np. )GET /foo.html
, wydaj starszą wersję .GET /foo.html HTTP/1.0
302
Dobrym przykładem tego
307 Internal Redirect
działania jest sytuacja, gdy Google Chrome napotyka połączenie HTTP do domeny, o której wie, że wymaga ścisłego bezpieczeństwa transportu.Przeglądarka płynnie przekierowuje, korzystając z tej samej metody, co oryginalne wywołanie.
źródło
Przykładowe użycie: URL przeniesiono z
/register-form.html
dosignup-form.html
.Metoda zmieni się na GET, zgodnie z RFC 7231: „Z przyczyn historycznych klient użytkownika MOŻE zmienić metodę żądania z POST na GET dla następnego żądania”.
Przykładowe użycie: jeśli przeglądarka wysłała POST do
/register.php
, to teraz załaduj (GET)/success.html
.Przykładowe użycie: jeśli przeglądarka wysłała test POST
/register.php
, oznacza to, że należy ponownie wykonać test POST o/signup.php
.RFC 7231 (od 2014 roku) jest bardzo czytelny i nie przesadza. Jeśli chcesz poznać dokładną odpowiedź, jest to zalecana lektura. Niektóre inne odpowiedzi używają RFC 2616 z 1999 roku, ale nic się nie zmieniło.
RFC 7238 określa status 308. Jest uważany za eksperymentalny, ale był już obsługiwany przez wszystkie główne przeglądarki w 2016 roku.
źródło
OCZEKIWANY dla 302: przekierowanie używa tej samej metody żądania POST na NEW_URL
RZECZYWISTY dla 302, 303: przekieruj metodę żądania zmiany z POST na GET na NEW_URL
RZECZYWISTY dla 307: przekierowanie używa tej samej metody żądania POST na NEW_URL
źródło
302 to tymczasowe przekierowanie, które jest generowane przez serwer, podczas gdy 307 jest wewnętrzną odpowiedzią na przekierowanie generowaną przez przeglądarkę. Wewnętrzne przekierowanie oznacza, że przekierowanie odbywa się automatycznie wewnętrznie przez przeglądarkę, w zasadzie przeglądarka sama zmienia wprowadzony adres URL z http na https w zapytaniu get przed wysłaniem żądania, więc żądanie niezabezpieczonego połączenia nigdy nie jest wysyłane do Internetu. To, czy przeglądarka zmieni adres URL na https, zależy od listy wstępnie załadowanych plików hsts, które są fabrycznie zainstalowane z przeglądarką. Możesz także dodać do listy dowolną witrynę, która obsługuje https, wpisując domenę na listę wstępnego ładowania hsts własnej przeglądarki, która znajduje się na chrome: //net-internals/#hsts.Inne strony domen mogą być dodawane przez ich właścicieli wstępnie załadować listę, wypełniając formularz na https://hstspreload.org/dzięki czemu jest instalowany w przeglądarkach dla każdego użytkownika, nawet jeśli wspomniałem, że możecie zrobić to także dla siebie.
Pozwól mi wyjaśnić na przykładzie: wysłałem
prośbę o pobranie do http://www.pentesteracademy.com, która obsługuje tylko https i nie mam tej domeny na mojej liście wstępnego ładowania hsts w przeglądarce, ponieważ właściciel witryny nie zarejestrował się dla niej w zestawie z wstępnie zainstalowaną listą wstępnego ładowania hsts. Żądanie GET dotyczące niezabezpieczonej wersji witryny jest przekierowywane do bezpiecznej wersji (patrz nagłówek http o nazwie lokalizacja w odpowiedzi na powyższym obrazie). Teraz dodaję witrynę do mojej listy wstępnego ładowania przeglądarki, dodając jej domenę w formie Dodaj domenę hsts na chrome: // net-internals / # hsts, która modyfikuje moją osobistą listę wstępnego ładowania w mojej przeglądarce Chrome. Pamiętaj, aby wybrać zawierać poddomeny dla Opcja STS tam. Zobaczmy teraz żądanie i odpowiedź dla tej samej witryny po dodaniu jej do listy wstępnego ładowania hsts.
w nagłówkach odpowiedzi widać wewnętrzne przekierowanie 307, w rzeczywistości ta odpowiedź jest generowana przez przeglądarkę, a nie przez serwer.
Również lista wstępnego ładowania HSTS może pomóc użytkownikom w dotarciu do niezabezpieczonej wersji strony, ponieważ przekierowania 302 są podatne na ataki mitm.
Mam nadzieję, że nieco pomogłem ci zrozumieć więcej na temat przekierowań.
źródło
Pierwotnie było tylko
302
Chodzi o to, że:
GET
w jakiejś lokalizacji, powtórzyłbyś swójGET
pod nowym adresem URLPOST
w jakiejś lokalizacji, powtórzyłbyś swójPOST
pod nowym adresem URLPUT
w jakiejś lokalizacji, powtórzyłbyś swójPUT
pod nowym adresem URLDELETE
w jakiejś lokalizacji, powtórzyłbyś swójDELETE
pod nowym adresem URLNiestety każda przeglądarka zrobiła to źle. Kiedy dostaję
302
, to oni zawsze przełączyć sięGET
na nowy adres URL, zamiast Ponowna próba wniosek z tego samego czasownika ( np ,POST
):Stało się de facto źle.
Wszystkie przeglądarki się
302
pomyliły. Więc303
i307
zostały stworzone.| Odpowiedź | Co powinny zrobić przeglądarki | Co faktycznie robią przeglądarki | | ------------------------ | ------------------------ --- | --------------------------- | | 302 Znaleziono | Ponów żądanie z nowym adresem URL POBIERZ z nowym adresem URL | 303 Zobacz inne | POBIERZ z nowym adresem URL POBIERZ z nowym adresem URL | 307 Tymczasowe przekierowanie | Ponów żądanie z nowym adresem URL Ponów żądanie z nowym adresem URL
W formie wykresu
5 różnych rodzajów przekierowań:
Alternatywnie:
źródło
Również dla administratorów serwerów może być ważne, aby pamiętać, że przeglądarki mogą wyświetlać użytkownikowi monit, jeśli użyjesz przekierowania 307.
Na przykład *, Firefox i Opera poprosiłyby użytkownika o zgodę na przekierowanie, podczas gdy Chrome, IE i Safari wykonałyby przekierowanie w sposób transparentny.
* na Bulletproof SSL i TLS (strona 192).
źródło
W niektórych przypadkach napastnik może wykorzystać 307 przekierowań, aby poznać dane uwierzytelniające ofiary.
Więcej informacji można znaleźć w rozdziale 3.1 od A Comprehensive analiza formalna Bezpieczeństwa OAuth 2.0 .
Autorzy powyższej pracy sugerują, co następuje:
źródło