Saya memiliki aplikasi ASP.NET MVC dengan rute yang memungkinkan pencarian barang melalui / search / <searchterm>.
Ketika saya menyediakan "search / abc" itu berfungsi dengan baik, tetapi ketika saya menyediakan "/ search / a + b + c" (dengan benar dikodekan url) maka IIS7 menolak permintaan dengan Kesalahan HTTP 404.11 ( Modul pemfilteran permintaan dikonfigurasi untuk menolak permintaan yang berisi urutan escape ganda ). Pertama-tama, mengapa ia melakukan ini? Tampaknya hanya membuang kesalahan jika itu adalah bagian dari URL, tetapi bukan sebagai bagian dari string kueri (/ transmit? Q = a + b + c berfungsi dengan baik).
Sekarang saya dapat mengaktifkan permintaan pelolosan ganda di bagian keamanan web.config saya tetapi saya ragu untuk melakukannya karena saya tidak memahami implikasinya, dan juga mengapa server menolak permintaan "a + b + c" sebagai bagian dari URL tetapi terima sebagai bagian dari string kueri.
Adakah yang bisa menjelaskan dan memberi nasihat apa yang harus dilakukan?
sumber
/search/a%2520b%2520c
mark-up yang mengarah ke kesalahan "A berpotensi berbahaya Request.Path nilai terdeteksi dari klien (%)". Sepertinya Anda tidak bisa menang.Jawaban:
Edit: Menambahkan penekanan ke bagian yang relevan.
Pada dasarnya: IIS terlalu paranoid. Anda dapat dengan aman menonaktifkan pemeriksaan ini jika Anda tidak melakukan sesuatu yang sangat tidak bijaksana dengan data uri yang didekodekan (seperti membuat URI sistem file lokal melalui penggabungan string).
Untuk menonaktifkan pemeriksaan, lakukan hal berikut (dari sini ): (lihat komentar saya di bawah untuk mengetahui apa yang diperlukan pelolosan ganda).
<system.webServer> <security> <requestFiltering allowDoubleEscaping="true"/> </security> </system.webServer>
Jika simbol plus adalah karakter yang valid dalam input pencarian, Anda harus mengaktifkan "allowDoubleEscaping" untuk mengizinkan IIS memproses input tersebut dari jalur URI.
Akhirnya, solusi yang sangat sederhana, jika terbatas adalah dengan menghindari '+' dan sebagai gantinya gunakan '% 20'. Bagaimanapun, menggunakan simbol '+' untuk menyandikan spasi bukanlah pengkodean url yang valid , tetapi spesifik untuk sekumpulan protokol terbatas dan mungkin didukung secara luas untuk alasan kompatibilitas mundur. Jika hanya untuk tujuan kanonikalisasi, Anda lebih baik mengenkode spasi sebagai '% 20'; dan ini menghindari masalah IIS7 (yang masih dapat muncul untuk urutan lain, seperti% 25ab.)
sumber
Saya hanya ingin menambahkan beberapa informasi ke jawaban Eamon Nerbonne yang terkait dengan bagian " apa yang harus dilakukan " dari pertanyaan Anda (tidak menjelaskan mengapa).
Anda juga dapat dengan mudah mengubah pengaturan aplikasi tertentu dengan
mengetik berikut ini (diambil dari sini: http://blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls-containing.aspx ):
%windir%\system32\inetsrv\appcmd set config "YOURSITENAME" -section:system.webServer/security/requestfiltering -allowDoubleEscaping:true
(Anda dapat mengganti
YOURSITENAME
denganDefault Web Site
menerapkan aturan ini ke situs web default)Sebuah contoh:
sumber
Pernahkah Anda berpikir untuk memiliki URL pencarian seperti '/ search / a / b / c'?
Anda perlu menyiapkan rute seperti
Dan kemudian ekstrak nilai pencarian dari string jalur Anda dalam tindakan.
HTH
Charles
sumber
Saya mengalami ini di bawah IIS 7.5 melakukan Server.TransferRequest () dalam aplikasi.
Mengkodekan nama file menyebabkan masalah pelarian ganda, tetapi jika saya tidak menyandikannya maka saya akan mengalami kesalahan "Request.Path yang berpotensi berbahaya" .
Menempatkan protokol apa pun, bahkan yang kosong, di URL yang saya berikan ke Server.TranferRequest () memperbaiki masalah.
Tidak bekerja:
context.Server.TransferRequest("/application_name/folder/bar%20bar.jpg");
Pekerjaan:
context.Server.TransferRequest("://folder/bar%20bar.jpg");
sumber