Akankah pengalihan 302 mempertahankan string pengarah?

92

Saya perlu mengalihkan pengguna dari satu halaman ke halaman lain, tetapi saya perlu mempertahankan string perujuk asli. Jadi, misalnya, jika mereka memulai di http://www.othersite.com/pageA.jsp , klik tautan yang mengarahkan mereka ke http://www.example.com/pageB.jsp , yang kemudian menjalankan 302 alihkan ke http://www.example.com/pageC.jsp , saya perlu memuat string perujukhttp://www.othersite.com/pageA.jsp

Apakah ini perilaku normal untuk pengalihan 302? Atau akankah perujuk asli saya dibatalkan, demi http://www.example.com/pageB.jsp? Itu tidak diinginkan.

Saya tidak tahu apakah ada bedanya, tapi saya bekerja di JSP, dan saya menggunakan response.sendRedirect()untuk menjalankan 302 redirect.

Saya harus menyebutkan bahwa saya melakukan percobaan dengan ini, dan tampaknya menyimpan string pengarah asli ( http://www.othersite.com/pageA.jsp) tetapi saya hanya ingin memastikan ini adalah perilaku default normal, dan bukan sesuatu yang aneh di pihak saya.


Meskipun saat ini saya menggunakan pengalihan 302, saya mungkin dapat menggunakan pengalihan 301. Tahukah Anda jika perilaku untuk pengalihan 301 lebih dapat diandalkan?

ketenangan dlm menghadapi bahaya
sumber
3
Saya hanya butuh yang sebaliknya. Lakukan pengalihan sisi server dengan mengubah perujuk pada pengalihan (jadi hapus perujuk asli). Siapa saja?
cprcrack

Jawaban:

32

Jawaban singkatnya adalah tidak ditentukan dalam RFC 2616 yang relevan http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.36 baik untuk header Referer atau 302 kode status.

Taruhan terbaik Anda adalah melakukan tes dengan beberapa browser dan melihat apakah ada perilaku konsensus.

Untuk sabuk lengkap dan kurung kurawal, enkode perujuk asli di URL pengalihan sehingga Anda dapat menjamin untuk mengambilnya kembali.

Kotak Malcolm
sumber
19
Kepada siapa yang mungkin tertarik, saya melakukan tes spme di browser utama: stackoverflow.com/questions/2158283/…
Marco Demaio
121

Saya tidak tahu tentang 302, tetapi saya menguji 301 pada beberapa browser hari ini, berikut hasilnya:

SKENARIO : pengguna mengklik link di domainX yang mengarah ke domainA. domainA melakukan 301 redirect ke domainB.

  • IE8 referersaat mendarat di domainB adalah: domainX (bahkan saat menggunakan penjelajahan InPrivate dan bahkan saat pengguna membuka tautan di tab baru)
  • Safari4 referersaat mendarat di domainB adalah: domainX (bahkan saat pengguna membuka tautan di tab baru)
  • FF3.6.10 referer saat mendarat di domainB adalah: domainX (bahkan ketika pengguna membuka tautan di tab baru)
  • Chrome5 referersaat mendarat di domainB adalah: domainX ( kecuali pengguna membuka tautan di tab baru)
  • Chrome26 referersaat mendarat di domainB adalah: domainX (bahkan saat pengguna membuka tautan di tab baru)
Marco Demaio
sumber
27
Catatan: pengujian ini telah dilakukan beberapa waktu yang lalu, dan saat ini Chrome 26 berperilaku dengan cara yang sama bahkan saat dibuka di tab baru .
Benjamin
Tidak diuji di semua browser, tetapi perilaku untuk 302 tampaknya identik.
Amir Ali Akbari
1
Catatan: jika halaman pengalihan (domainA) mengeluarkan header Referrer-Policy: no-referrer , maka Chrome (dan Opera) tidak akan menyetel header Referer pada permintaan ke halaman tujuan (domainB). Firefox dan Edge masih mengirimkannya.
David Balažic
12

Pertanyaan bagus. Dalam kasus ini, pengiriman perujuk sepenuhnya bergantung pada browser (karena browser diberitahu untuk membuat permintaan lain ke sumber daya baru).

RFC 2616 tetap bungkam tentang masalah tersebut:

Sumber daya yang diminta berada sementara di bawah URI yang berbeda. Karena pengalihan mungkin berubah sewaktu-waktu, klien HARUS terus menggunakan URI Permintaan untuk permintaan di masa mendatang. Respons ini hanya dapat disimpan dalam cache jika diindikasikan oleh bidang header Kontrol-Cache atau Kedaluwarsa.

Saya tidak akan mempercayai browser untuk mengirimkan pengarah yang tepat. Saya yakin setidaknya ada satu yang mengirimkan sesuatu yang berbeda dari yang lain.

Solusi

Jika Anda bisa, mengapa tidak menambahkan ?override_referer=<old_url>parameter ke URL yang Anda alihkan, dan parse nilai itu alih-alih HTTP_REFERER.

Dengan cara itu Anda bisa yakin untuk selalu mendapatkan hasil yang benar, dan Anda tidak akan kehilangan apa pun dalam keamanan: Perujuk dapat dipalsukan dengan cara apa pun.

Pekka
sumber
4
Anda sebenarnya kehilangan sesuatu dalam keamanan dengan membuat perujuk dapat diganti di URL. Di sebagian besar browser modern, perujuk untuk permintaan AJAX tidak dapat diubah melalui JavaScript; Namun, URL-nya jelas bisa. Ini berarti bahwa jika terjadi serangan XSS, perujuk lebih dapat dipercaya daripada parameter URL. Jangan salah sangka, referernya masih jelas merupakan input pengguna yang tidak bisa dipercaya sepenuhnya. Tetapi jauh lebih sulit untuk memalsukan data itu untuk orang lain daripada mengubah URL.
filum
7

Saya memiliki masalah yang berlawanan: Saya ingin pengarah itu adalah "halamanB" tetapi tidak ada browser saat ini yang memproses dengan cara ini ...

Jadi saya mencoba dengan pengalihan HTML di halamanB (bukan pengalihan 301 atau 302):

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

Dan hasilnya mengejutkan:

  • Referer adalah pageB dengan Chrome
  • Referer KOSONG dengan FireFox & IE!

Semoga ini bisa membantu

fred727
sumber