Nilai Request.Path yang berpotensi berbahaya terdeteksi dari klien (*)

218

Saya menerima kesalahan yang cukup jelas:

Nilai Request.Path yang berpotensi berbahaya terdeteksi dari klien (*).

Masalahnya adalah karena *dalam URL permintaan:

https://stackoverflow.com/Search/test*/0/1/10/1

Url ini digunakan untuk mengisi halaman pencarian di mana 'test *' adalah istilah pencarian dan sisanya dari url berhubungan dengan berbagai filter lainnya.

Apakah ada cara mudah untuk mengizinkan karakter khusus ini di URL? Saya sudah mencoba memodifikasi web.config, tetapi tidak berhasil.

Haruskah saya menyandikan / mendekode karakter khusus secara manual? Atau apakah ada praktik terbaik untuk melakukan ini, saya ingin menghindari menggunakan string kueri. - tapi itu bisa jadi pilihan.

Aplikasi itu sendiri adalah aplikasi formulir c# asp.netweb yang menggunakan perutean untuk menghasilkan URL yang bagus di atas.

samdd
sumber
1
Apakah halaman Anda ada ValidateRequest=falsedi bagian atas?
Neil Knight
Saya tidak tahu untuk alasan apa situs web secara internal mencoba pengalihan yang membuat URL seperti ' localhost /: // localhost / myWebsiteName ' yang memberi saya kesalahan yang sama. Saya tidak tahu mengapa pipa ASP.net menganggapnya sebagai URL permintaan berbahaya.
RBT

Jawaban:

97

The *karakter tidak diperbolehkan di jalur URL, tapi tidak ada masalah menggunakannya dalam string:

http://localhost:3286/Search/?q=test*

Ini bukan masalah penyandian, *karakter tidak memiliki arti khusus dalam URL, jadi tidak masalah apakah URL Anda menyandikannya atau tidak. Anda harus menyandikannya menggunakan skema yang berbeda, lalu mendekodekannya.

Misalnya menggunakan karakter arbitrer sebagai karakter pelarian:

query = query.Replace("x", "xxx").Replace("y", "xxy").Replace("*", "xyy");

Dan decoding:

query = query.Replace("xyy", "*").Replace("xxy", "y").Replace("xxx", "x");
Guffa
sumber
15
Gim "xxx" "xxy" "xyy" cukup pintar. Anda mungkin ingin menguraikan logika di balik itu agar tidak membingungkan pembaca.
SimpleVar
2
Permintaan itu untuk menggunakannya di PATHdan bukan di querystring.
Hugo Delsing
Saya mengalami skenario yang sama di mana salah satu parameter saya adalah URL. Bahkan ketika URL dikodekan dengan benar, saya akan mendapatkan kesalahan ini. Saya akhirnya hanya base64 menyandikan parameter (dan memecahkan kode dalam api saya) yang jauh lebih mudah daripada mencoba mencari tahu apa yang sedang terjadi. Mungkin pilihan yang lebih baik yang menerapkan penggantian rutin Anda sendiri juga.
SpokaneDJ
1
Tidak bisakah Anda menggunakan aa<=> adan ab<=> *sebagai skema penyandian yang lebih sederhana?
Words Like Jared
Untuk saat ini, ini menyelamatkan saya, Terima kasih, Tetapi pada waktu yang tepat saya ingin memeriksa saran ini: stackoverflow.com/a/603962/1830909 dan saya akan senang jika mendengar pikiran Anda.
QMaster
316

Jika Anda menggunakan .NET 4.0, Anda harus dapat mengizinkan url ini melalui web.config

<system.web>
    <httpRuntime 
            requestPathInvalidCharacters="&lt;,&gt;,%,&amp;,:,\,?" />
</system.web>

Catatan, Saya baru saja menghapus tanda bintang (*), string default aslinya adalah:

<httpRuntime 
          requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,:,\,?" />

Lihat pertanyaan ini untuk lebih jelasnya.

Dave Transom
sumber
5
Adakah cara untuk melakukan ini menggunakan atribut mvc pada suatu tindakan sehingga saya tidak harus mematikannya untuk seluruh aplikasi? Mirip dengan jawaban ini di sini: stackoverflow.com/a/1540976/298758
longda
4
@longda: Mungkin mencoba membungkusnya dengan elemen <location path = "my / path"> untuk url yang Anda butuhkan. Menggunakan refleksi akan cukup sederhana dari perspektif global, tapi saya tidak yakin tentang pengaturannya berdasarkan per controller / action. Mungkin memulai pertanyaan?
Dave Transom
Hanya saja tidak bekerja pada proyek ASP.net MVC, menerima proses yang berjalan untuk menentukan tata letak di viewStart mendapat kesalahan ini: Karakter ilegal di jalur.
QMaster
7

Bagi saya, saya sedang mengerjakan .net 4.5.2 dengan web api 2.0, saya memiliki kesalahan yang sama, saya atur hanya dengan menambahkan requestPathInvalidCharacters = "" di requestPathInvalidCharacters Anda harus menyetel karakter yang tidak diizinkan, jika tidak, Anda harus menghapus karakter yang harus dihapus menyebabkan masalah ini.

<system.web>
     <httpRuntime targetFramework="4.5.2" requestPathInvalidCharacters="" />
     <pages  >
      <namespaces>
     ....
 </namespaces>
    </pages> 
  </system.web>

** Perhatikan bahwa ini bukan praktik yang baik, mungkin posting dengan parameter ini karena atribut objek lebih baik atau mencoba menyandikan karakter khusus. - Setelah mencari praktik terbaik untuk merancang api sisanya, saya menemukan bahwa dalam pencarian, pengurutan dan paginnasi, kita harus menangani parameter kueri seperti ini

/companies?search=Digital%26Mckinsey

dan ini menyelesaikan masalah ketika kita menyandikan & dan mengganti-ganti itu di url sebesar% 26 dengan cara apa pun, di server kita menerima parameter yang benar Digital & Mckinsey

tautan ini dapat membantu praktik terbaik merancang api web sisanya https://hackernoon.com/restful-api-design-guidelines-the-best-practices-60e1d954e7c9

MNF
sumber
6

Anda harus menyandikan nilai rute dan kemudian (jika perlu) mendekode nilai sebelum mencari.

Tejs
sumber
Terimakasih atas tanggapan Anda. Apakah maksud Anda secara efektif melakukan penggantian pada item seperti * dan kemudian menggantinya kembali saat Anda membacanya?
Bisakah Anda menunjukkan contoh kode pengkodean dan pengodean nilai?
Ciaran Gallagher
1

Bagi saya, saat mengetik url, pengguna secara tidak sengaja menggunakan / bukannya a? untuk memulai parameter kueri

misalnya:

url.com/endpoint/parameter=SomeValue&otherparameter=Another+value

yang seharusnya:

url.com/endpoint?parameter=SomeValue&otherparameter=Another+value

trykyn
sumber
Ya, bahkan sama untuk saya url.com/endpoint¶meter=SomeValue&otherparameter=AnotherValue
Bhargav Konda
0

Pengecualian ini terjadi pada aplikasi saya dan agak menyesatkan.

Itu dilemparkan ketika saya memanggil metode Web halaman .aspx menggunakan panggilan metode ajax, melewati objek array JSON. Tanda tangan metode Halaman Web berisi larik objek .NET yang sangat diketik, OrderDetails. Properti Actual_Qty didefinisikan sebagai int, dan objek JSON properti Actual_Qty berisi "4" (karakter spasi tambahan). Setelah menghapus ruang ekstra, konversi dimungkinkan, metode Halaman Web berhasil dijangkau oleh panggilan ajax.

Leher baju berenda
sumber
0

Cobalah untuk menetapkan server proyek web yang layak sebagai IIS Lokal jika IIS Express. Pastikan jika url proyek benar dan buat direktori virual.

Burk
sumber
0

Ketika berhadapan dengan Uniform Resource Locator (URL) ada standar sintaksis tertentu , dalam situasi khusus ini kita berhadapan dengan Karakter Cadangan .

Sampai dengan RFC 3986 , Karakter Cadangan dapat (atau mungkin tidak) didefinisikan sebagai pembatas oleh sintaksis umum, oleh setiap sintaksis khusus skema, atau oleh sintaksis implementasi spesifik dari algoritma dereferencing URI; Dan tanda bintang (*) adalah Karakter Cadangan.

Praktik terbaik adalah menggunakan Karakter yang Tidak Ditangguhkan dalam URL atau Anda dapat mencoba menyandikannya.

Terus gali:

Roshana Pitigala
sumber
1
Kesalahan ini juga terjadi jika karakter yang dipesan dalam URL dikodekan-persen, misalnya, %25bukan %, jadi IIS dapat mengembalikan kesalahan ini untuk URL yang benar-benar valid.
Florian Winter