302 ve 307 yönlendirmesi arasındaki fark nedir?


208

302 FOUNDA ile 307 TEMPORARY REDIRECTHTTP yanıtı arasındaki fark nedir ?

W3 spesifikasyonu , her ikisinin de geçici yönlendirmeler için kullanıldığını ve yanıt özellikle izin vermediği sürece her ikisinin de önbelleğe alınamayacağını gösteriyor.

Yanıtlar:


99

Fark yönlendirme kaygıları POST, PUTve DELETEistekleri ve hangi sunucunun beklentileri (kullanıcı aracısı davranış içindir RFC 2616):

Not: RFC 1945 ve RFC 2068, istemcinin yeniden yönlendirilen istekte yöntemi değiştirmesine izin verilmediğini belirtir. Bununla birlikte, mevcut kullanıcı aracısı uygulamalarının çoğu 302'ye 303 yanıtı gibi davranır ve orijinal istek yönteminden bağımsız olarak Konum alanı değeri üzerinde bir GET gerçekleştirir. Durum kodları 303 ve 307, istemciden ne tür bir tepki beklendiğini kesin olarak netleştirmek isteyen sunucular için eklenmiştir.

Ayrıca, 30x yönlendirme kodlarıyla ilgili Wikipedia makalesini okuyun .


Yani, bir ayrıştırıcı / aracı / tarayıcı perspektifinden, 302 ve 307'yi aynı hak olarak ele alabiliriz? ( Tam kod aynı parça daha ileri distinguishment olmadan hem davalarını için kullanılabilir?)
Pacerier

Hayır - 302 ve 303'e aynı şekilde davranabilirsiniz, ancak 307 farklıdır.
Quentin Skousen

@kkhugs, Olmazsa olsun, get-302 1.1 tarayıcılarında yapılır gibi aynı şekilde 1.0-tarayıcı yapmak için 1.0 tarayıcı gerekir. 1.0-302 sonrası-302'yi aynı şekilde yapabilmesi için 1.0 tarayıcı gerekir, ancak ilk önce devam etmek için bir kullanıcı onayı gerekir ve yöntemin postalanması gerekir.
Pacerier

Get-302'yi get-307 ile aynı şekilde yapmak için 1.1 tarayıcı gerekir.
Pacerier

161

307, kullanıcı aracıları , 302 yanıtı alan ve Konum yanıtı başlığına bir GET isteği gönderen POST isteklerini almak için fiili bir davranış olarak kabul etti .

Yani yanlış davranış - sadece bir 303 bir GET dönüşme bir POST neden olmalıdır. Orijinal POST isteği bir 302 döndürdüyse, kullanıcı aracıları yeni URL isterken POST yöntemine sadık kalmalıdır (ancak etmemelidir).

307 sunucuları bir yöntem değişikliği gerektiğini kullanıcı aracıya temizlemek yapmasına izin tanıtıldı değil Konum yanıt başlığını izlerken müşteri tarafından yapılabilir.


3
Yanlış yanıt veren kullanıcı aracısı örnekleri var mı? Genellikle ziyaretçilerin çok küçük bir yüzdesi midir?
goodguys_activate

6
@ makerofthings7 Tüm tarayıcılar 302hatalı çalışıyor. Chrome 30, IE10. Fiili yanlış uygulama haline geldi ; birçok web sitesi sorunu yanlışlıkla 302 çünkü bu değiştirilemez. Aslında ASP.net MVC yanlış 302 tarayıcılar yanlış işlemesine bağlı olarak, yanlış 302 verir .
Ian Boyd

1
@IanBoyd Bunu yapmanın tek nedeni HTTP 1.1 belirtiminde 303de kullanılmaya başlanması 307ve bu nedenle HTTP 1.0 kullanıcı aracılarıyla geriye dönük uyumluluğa izin vermesidir. Tabii ki, asıl soru şu anda hala HTTP 1.0 kullanıcı aracılarını kullanmalı mıyız?
ewanm89

1
@ ewanm89 Çerçevenin doğru adlandırılmış yanıt yöntemini (ör. Response.RedirectSeeOther) oluşturabileceği ve istemci 1.1 değilse (ör GET /foo.html. GET /foo.html HTTP/1.0) eski kalıbı vermiş gibi görünüyor 302.
Ian Boyd

Yeniden yönlendirildiğinde 302 = 303 gibi görünüyor.
vee

60

307 Internal RedirectEylemin iyi bir örneği, Google Chrome'un Sıkı Aktarım Güvenliği gerektirdiği bildiği bir alan adında bir HTTP çağrısı ile karşılaşmasıdır.

Tarayıcı, orijinal çağrı ile aynı yöntemi kullanarak sorunsuz bir şekilde yönlendirir.

HTST 307 Dahili Yönlendirme


2
Google'ın bu özelliği ne zaman uyguladığını biliyor musunuz?
Tijme

2
Evet, bunun gerçekleştiğini görüyorum - sunucumuz bunu göndermiyor - krom devtools'ta öyle görünüyor ama sadece yeniden yönlendirme yapan krom çünkü Sıkı Taşıma Güvenliği başlığımız var
mike nelson

16

Akış Şeması

  • 301: kalıcı yönlendirme: URL eski ve değiştirilmelidir. Tarayıcılar bunu önbelleğe alır.
    Örnek kullanım: URL taşındı /register-form.htmliçin signup-form.html.
    Yöntem, RFC 7231'e göre GET olarak değişecektir: "Geçmişteki nedenlerden dolayı, bir kullanıcı aracısı sonraki yöntem için istek yöntemini POST'tan GET olarak değiştirebilir."
  • 302: geçici yönlendirme. Yalnızca HTTP / 1.0 istemcileri için kullanın. Bu durum kodu yöntemi değiştirmemeli, ancak tarayıcılar yine de yaptı. RFC şöyle diyor: "HTTP öncesi / 1.1 öncesi pek çok kullanıcı aracısı [303] anlamıyor. Bu tür istemcilerle birlikte çalışabilirlik söz konusu olduğunda, bunun yerine 302 durum kodu kullanılabilir, çünkü çoğu kullanıcı aracısı burada açıklandığı gibi 302 yanıtına tepki verir 303 için. " Tabii ki, bazı müşteriler spesifikasyona göre uygulayabilir, bu nedenle bu eski müşterilerle birlikte çalışabilirlik gerçek bir endişe değilse, tutarlı sonuçlar için 303 daha iyidir.
  • 303: geçici yönlendirme, yöntemi GET olarak değiştir.
    Örnek kullanım: tarayıcı POST'u gönderdiyse /register.php, şimdi (GET) yükleyin /success.html.
  • 307: isteği yeniden aynı şekilde tekrarlayan geçici yönlendirme.
    Örnek kullanım: tarayıcı bir POST gönderdiyse, bu adrese POST'u /register.phpyeniden yapmasını söyler /signup.php.
  • 308: isteği aynı şekilde tekrarlayan kalıcı yönlendirme. 307, 303'ün "yöntem değiştirme yok" muadili olduğunda, bu 308 durumu 301'in "yöntem değiştirme yok" muadili olmaktadır.

RFC 7231 (2014'ten itibaren) çok okunabilir ve aşırı ayrıntılı değildir. Kesin cevabı bilmek istiyorsanız, önerilen bir okuma. Diğer bazı cevaplar 1999'dan RFC 2616'yı kullanıyor, ancak hiçbir şey değişmedi.

RFC 7238 308 durumunu belirtir. Deneysel olarak kabul edilir, ancak 2016'da tüm büyük tarayıcılar tarafından zaten desteklenmiştir .


302 kullanımdan kaldırıldı.
Julian Reschke

@JulianReschke Wikipedia "302'nin yerini 303 ve 307 aldı." Belki de anadili konuştuğum için değil, ama benim için (bu bağlamda) yerini aldı ve kullanımdan kaldırıldı aynı anlama geliyor: ya 303 ya da 307 kullanın, ama 302 değil. Bunu yanlış mı okuyorum?
Luc

Yanlış olan, Wikipedia'nın bu konuda söz sahibi olduğu varsayımıdır. 302 kullanımdan kaldırılmışsa, HTTP bunu söylerdi.
Julian Reschke

@JulianReschke Fair yeterince, ben kaynak aldı ve waddayaknow? Tamamen haklısın. RFC aslında çok anlaşılabilir ve hatta belirli koşullar altında 302'yi bile tavsiye ediyorlar. "Güncelleme" ve "geçersiz" RFC'lerin hiçbiri durum kodlarıyla ilgili değildir, bu yüzden bu 1999 belgesinin gerçekten de en sonuncusu olduğunu düşünüyorum. Cevabımı güncelleyeceğim.
Luc

İlgili olan, IANA durum kodu kaydı ve dolayısıyla bu durumda RFC 7231'dir.
Julian Reschke

8

302 için EXPECTED: yönlendirme NEW_URL üzerinde aynı istek yöntemini POST kullanıyor

CLIENT POST OLD_URL -> SERVER 302 NEW_URL -> CLIENT POST NEW_URL

302, 303 için GERÇEK: yönlendirme değişikliği yöntemini POST'tan NEW_URL'da GET'e değiştir

CLIENT POST OLD_URL -> SERVER 302 NEW_URL -> CLIENT GET NEW_URL (redirect uses GET)
CLIENT POST OLD_URL -> SERVER 303 NEW_URL -> CLIENT GET NEW_URL (redirect uses GET)

307 için ACTUAL: yönlendirme, NEW_URL üzerinde aynı istek yöntemi POST'u kullanıyor

CLIENT POST OLD_URL -> SERVER 307 NEW_URL -> CLIENT POST NEW_URL

2

302, sunucu tarafından oluşturulan geçici yönlendirme, 307 ise tarayıcı tarafından oluşturulan dahili yönlendirme yanıtıdır. Dahili yönlendirme, yönlendirmenin tarayıcı tarafından otomatik olarak yapıldığını, temel olarak tarayıcı, istekte bulunmadan önce girilen url'yi http'den https'ye değiştirir, böylece güvenli olmayan bağlantı isteği asla internete gönderilmez. Tarayıcının url'yi https olarak değiştirip değiştirmeyeceği, tarayıcıyla önceden yüklenmiş olarak gelen hsts önyükleme listesine bağlıdır. Ayrıca, https'yi destekleyen herhangi bir siteyi, chrome: //net-internals/#hsts. adresindeki kendi tarayıcınızın hsts önyükleme listesine girerek listeye ekleyebilirsiniz. Sahipleri tarafından bir daha fazla web sitesi alanı eklenebilir https://hstspreload.org/ adresindeki formu doldurarak listeyi önceden yüklemek içinBöylece her kullanıcı için tarayıcılara önceden yüklenmiş olarak gelir, ancak özellikle kendiniz için de yapabileceğinizden bahsetmeme rağmen.


Bir örnekle açıklayayım: http://www.pentesteracademy.com adresine yalnızca https'yi destekleyen
bir istekte bulundum ve site sahibi bunun için kaydolmadığı için tarayıcımdaki hsts önyük listemde bu etki alanına sahip değilim önceden yüklenmiş hsts önyükleme listesi ile birlikte gelir. Sitenin güvenli olmayan sürümü için GET isteği güvenli sürüme yönlendirilir (yukarıdaki resimde yanıt olarak bunun için http başlıklı konuma bakın). Şimdi, siteyi chrome: // net-internals / # hsts adresindeki hsts alan adını ekle bölümüne ekleyerek kendi tarayıcı ön yükleme listeme ekliyorum; bu, krom tarayıcımda kişisel ön yükleme listemi değiştiriyor. Orada STS seçeneği. Şimdi hsts önyükleme listesine ekledikten sonra aynı web sitesinin isteğini ve yanıtını görelim.istek ve yanıt başlıkları



istek ve yanıt başlıkları
yanıt yönergelerinde dahili yönlendirme 307'yi görebilirsiniz, aslında bu yanıt sunucunuz tarafından değil tarayıcınız tarafından oluşturulur.
Ayrıca, HSTS önyükleme listesi, kullanıcıların 302 yönlendirmesi saldırıları hafifletmeye eğilimli olduğundan kullanıcıların sitenin güvenli olmayan sürümüne ulaşmasını önlemeye yardımcı olabilir.
Umarım yönlendirmeler hakkında daha fazla bilgi edinmenize yardımcı oldum.


2

Başlangıçta sadece 302

| Response               | What browsers should do   |
|------------------------|---------------------------|
| 302 Found              | Redo request with new url |

Fikir şudur:

  • bir GETkonumda bir şey yapsaydınız GET, yeni URL'nizi tekrar yaparsınız
  • bir POSTkonumda bir şey yapsaydınız POST, yeni URL'nizi tekrar yaparsınız
  • bir PUTkonumda bir şey yapsaydınız PUT, yeni URL'nizi tekrar yaparsınız
  • bir DELETEkonumda bir şey yapsaydınız DELETE, yeni URL'nizi tekrar yaparsınız
  • vb

Ne yazık ki her tarayıcı yanlış yaptı. A alırken , isteği aynı fiil ile yeniden denemek yerine 302her zaman GETyeni URL'ye geçerler ( ör . ):POST

  • Mozaik yanlış yaptı
  • Netscape hataları Mozaik'te kopyaladı; bu yüzden yanlış anladılar
  • Internet Explorer hataları Netscape'e kopyaladı; bu yüzden yanlış anladılar

Bu oldu fiili yanlış.

Tüm tarayıcılar 302yanlış. Yani 303ve 307yaratıldı.

| Yanıt | Tarayıcılar ne yapmalı | Tarayıcılar aslında ne yapar | | ------------------------ | ------------------------ --- | --------------------------- | | 302 Bulundu | Yeni url ile isteği yeniden yapın | Yeni url ile GET | | 303 Diğerlerini Gör | Yeni url ile GET | Yeni url ile GET | | 307 Geçici Yönlendirme | Yeni url ile isteği yeniden yapın | Yeni url ile isteği yeniden yapın |

Grafik formunda

5 farklı yönlendirme türü:

╔═══════════╤════════════════════════════════════════════════╗
║           │                Switch to GET?                  ║
║ Temporary │          No            │         Yes           ║
╠═══════════╪════════════════════════╪═══════════════════════╣
║ No        │ 308 Permanent Redirect │ 301 Moved Permanently ║
╟───────────┼────────────────────────┼───────────────────────╢
║ Yes       │ 307 Temporary Redirect │ 303 See Other         ║
║           │ 302 Found (intended)   │ 302 Found (actual)    ║
╚═══════════╧════════════════════════╧═══════════════════════╝

Alternatif:

| Response                 | Switch to get? | Temporary? |
|--------------------------|----------------|------------|
| 301 Moved Permanently    | No             | No         |
| 302 Found (intended)     | No             | Yes        |
| 302 Found (actual)       | Yes            | Yes        |
| 303 See Other            | Yes            | Yes        |
| 307 Temporary Redirect   | No             | Yes        |
| 308 Permanent Redirect   | No             | No         |

1

Ayrıca, sunucu yöneticileri için, 307 yönlendirmesi kullanırsanız tarayıcıların kullanıcıya bir istem gösterebileceğini unutmamak önemlidir.

Örneğin *, Firefox ve Opera kullanıcıdan yeniden yönlendirme izni isterken Chrome, IE ve Safari yönlendirmeyi şeffaf bir şekilde yapar.

* Kurşun geçirmez SSL ve TLS başına (sayfa 192).


Bu yalnızca POST gibi güvenli olmayan istekler için geçerlidir.
Julian Reschke

0

Bazı kullanım durumlarında, bir saldırgan tarafından kurbanın kimlik bilgilerini öğrenmek için 307 yönlendirmesi kötüye kullanılabilir.

Daha fazla bilgi bulunabilir bölüm 3.1 arasında OAuth 2.0 Kapsamlı Bir Biçimsel Güvenlik Analizi .

Yukarıdaki makalenin yazarları aşağıdakileri önermektedir:

Fix. OAuth standardındaki mevcut ifadelerin aksine, yönlendirme için kesin yöntem bir uygulama detayı değil, OAuth güvenliği için gereklidir. HTTP standardında ( RFC 7231 ), bir HTTP POST isteğinin gövdesini bırakmak için benzersiz bir şekilde yalnızca 303 yönlendirmesi tanımlanır. En yaygın kullanılan 302 de dahil olmak üzere diğer tüm HTTP yeniden yönlendirme durum kodları, tarayıcıyı POST isteğini ve form verilerini koruma seçeneği olarak bırakır. Uygulamada, tarayıcılar genellikle bir GET isteğine göre yeniden yazar ve 307 yönlendirmeleri dışında form verilerini bırakır. Bu nedenle, OAuth standardı, bu sorunu gidermek için yukarıda belirtilen adımlar için 303 yönlendirmeleri gerektirmelidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.