Setiap kali pengguna memposting sesuatu yang berisi <
atau >
dalam halaman di aplikasi web saya, saya mendapatkan pengecualian ini.
Saya tidak ingin membahas tentang kepintaran melempar pengecualian atau menabrak seluruh aplikasi web karena seseorang memasukkan karakter ke dalam kotak teks, tetapi saya mencari cara yang elegan untuk menangani hal ini.
Menjebak pengecualian dan tampil
Terjadi kesalahan, silakan kembali dan ketik ulang seluruh formulir Anda lagi, tapi kali ini jangan gunakan <
bagi saya sepertinya tidak cukup profesional.
Menonaktifkan validasi pos ( validateRequest="false"
) pasti akan menghindari kesalahan ini, tetapi itu akan membuat halaman rentan terhadap sejumlah serangan.
Idealnya: Ketika suatu posting kembali terjadi yang mengandung karakter-karakter terbatas HTML, nilai yang diposkan dalam koleksi Formulir akan secara otomatis disandikan dengan HTML. Jadi .Text
properti kotak teks saya akan menjadisomething & lt; html & gt;
Apakah ada cara saya bisa melakukan ini dari seorang pawang?
<httpRuntime requestValidationMode="2.0" />
ke web.configJawaban:
Saya pikir Anda menyerang dari sudut yang salah dengan mencoba menyandikan semua data yang diposting.
Perhatikan bahwa "
<
" juga dapat berasal dari sumber luar lainnya, seperti bidang basis data, konfigurasi, file, umpan, dan sebagainya.Lebih jauh, "
<
" secara inheren tidak berbahaya. Ini hanya berbahaya dalam konteks tertentu: ketika menulis string yang belum dikodekan ke output HTML (karena XSS).Dalam konteks lain, berbagai sub-string berbahaya, misalnya, jika Anda menulis URL yang disediakan pengguna ke dalam tautan, "
javascript:
" sub-string mungkin berbahaya. Karakter kutip tunggal di sisi lain berbahaya ketika interpolasi string dalam query SQL, tetapi sangat aman jika itu adalah bagian dari nama yang dikirimkan dari formulir atau dibaca dari bidang database.Intinya adalah: Anda tidak dapat memfilter input acak untuk karakter berbahaya, karena karakter apa pun mungkin berbahaya dalam keadaan yang tepat. Anda harus menyandikan pada titik di mana beberapa karakter tertentu dapat menjadi berbahaya karena mereka masuk ke sub-bahasa yang berbeda di mana mereka memiliki makna khusus. Saat Anda menulis string ke HTML, Anda harus menyandikan karakter yang memiliki arti khusus dalam HTML, menggunakan Server.HtmlEncode. Jika Anda meneruskan string ke pernyataan SQL dinamis, Anda harus menyandikan karakter yang berbeda (atau lebih baik, biarkan kerangka melakukannya untuk Anda dengan menggunakan pernyataan yang disiapkan atau sejenisnya) ..
Ketika Anda yakin Anda meng-encode HTML di mana-mana Anda mengirimkan string ke HTML, lalu atur
validateRequest="false"
di<%@ Page ... %>
direktif dalam.aspx
file Anda .Di .NET 4 Anda mungkin perlu melakukan sedikit lagi. Terkadang perlu juga menambahkan
<httpRuntime requestValidationMode="2.0" />
ke web.config ( referensi ).sumber
<httpRuntime requestValidationMode="2.0" />
tag lokasi untuk menghindari terbunuhnya perlindungan berguna yang diberikan oleh validasi dari bagian situs Anda yang lain.[AllowHtml]
di properti model.GlobalFilters.Filters.Add(new ValidateInputAttribute(false));
diApplication_Start()
.<pages validateRequest="false" />
in<system.web />
. Melakukan hal itu akan menerapkan properti ke semua halaman.Ada solusi berbeda untuk kesalahan ini jika Anda menggunakan ASP.NET MVC:
C # sampel:
Sampel Visual Basic:
sumber
[AllowHtml]
lebih baik daripadaValidateInput(false)
, karena[AllowHtml]
didefinisikan sekaligus untuk properti yaitu bidang Editor dan setiap kali digunakan tidak perlu menggunakannya untuk beberapa tindakan. Apa yang Anda sarankan?Di ASP.NET MVC (mulai dari versi 3), Anda bisa menambahkan
AllowHtml
atribut ke properti di model Anda.Ini memungkinkan permintaan untuk memasukkan markup HTML selama pengikatan model dengan melewatkan validasi permintaan untuk properti.
sumber
ValidateInput(false)
danAllowHtml
? Apa keuntungan satu dari yang lain? Kapan saya ingin menggunakan,AllowHtml
bukanValidateInput(false)
? Ketika saya ingin menggunakanValidateInput(false)
lebihAllowHtml
? Kapan saya ingin menggunakan keduanya? Apakah masuk akal untuk menggunakan keduanya?Jika Anda menggunakan .NET 4.0 pastikan Anda menambahkan ini di file web.config Anda di dalam
<system.web>
tag:Di .NET 2.0, validasi permintaan hanya diterapkan pada
aspx
permintaan. Di .NET 4.0 ini diperluas untuk mencakup semua permintaan. Anda dapat kembali ke hanya melakukan validasi XSS saat memproses.aspx
dengan menentukan:Anda dapat menonaktifkan permintaan untuk memvalidasi sepenuhnya dengan menetapkan:
sumber
<system.web>
tag.Untuk ASP.NET 4.0, Anda dapat mengizinkan markup sebagai input untuk halaman tertentu dan bukan keseluruhan situs dengan meletakkan semuanya dalam
<location>
elemen. Ini akan memastikan semua halaman Anda lainnya aman. Anda TIDAK perlu memasukkanValidateRequest="false"
halaman .aspx Anda.Lebih aman untuk mengontrol ini di dalam web.config Anda, karena Anda dapat melihat di tingkat situs mana halaman memungkinkan markup sebagai input.
Anda masih perlu memvalidasi input pada halaman di mana validasi permintaan dinonaktifkan.
sumber
Jawaban sebelumnya sangat bagus, tetapi tidak ada yang mengatakan bagaimana cara mengecualikan satu bidang dari validasi untuk injeksi HTML / JavaScript. Saya tidak tahu tentang versi sebelumnya, tetapi dalam MVC3 Beta Anda dapat melakukan ini:
Ini masih memvalidasi semua bidang kecuali untuk yang dikecualikan. Yang menyenangkan tentang ini adalah bahwa atribut validasi Anda masih memvalidasi bidang, tetapi Anda tidak mendapatkan "Permintaan yang berpotensi berbahaya. Nilai form terdeteksi dari klien" pengecualian.
Saya telah menggunakan ini untuk memvalidasi ekspresi reguler. Saya telah membuat ValidationAttribute saya sendiri untuk melihat apakah ekspresi reguler itu valid atau tidak. Karena ekspresi reguler dapat berisi sesuatu yang terlihat seperti skrip, saya menerapkan kode di atas - ekspresi reguler masih diperiksa apakah valid atau tidak, tetapi tidak jika itu berisi skrip atau HTML.
sumber
[AllowHtml]
pada properti model alih-alih[ValidateInput]
pada Action untuk mencapai hasil akhir yang sama.[AllowHtml]
itu bukanlah suatu pilihan. Saya sarankan memeriksa artikel ini: weblogs.asp.net/imranbaloch/… , tetapi juga agak lama dan mungkin sudah ketinggalan zaman.Di ASP.NET MVC Anda perlu mengatur requestValidationMode = "2.0" dan validateRequest = "false" di web.config, dan menerapkan atribut ValidateInput ke tindakan controller Anda:
dan
sumber
validateRequest="false"
itu tidak perlu, hanyarequestValidationMode="2.0"
Anda dapat menyandikan konten kotak teks HTML , tetapi sayangnya itu tidak akan menghentikan pengecualian terjadi. Dalam pengalaman saya tidak ada jalan keluar, dan Anda harus menonaktifkan validasi halaman. Dengan melakukan itu Anda berkata: "Aku akan berhati-hati, aku janji."
sumber
Untuk MVC, abaikan validasi input dengan menambahkan
di atas setiap Aksi di Controller.
sumber
Anda dapat menangkap kesalahan itu di Global.asax. Saya masih ingin memvalidasi, tetapi menunjukkan pesan yang sesuai. Di blog yang tercantum di bawah ini, sampel seperti ini tersedia.
Mengarahkan kembali ke halaman lain juga sepertinya merupakan respons yang masuk akal terhadap pengecualian.
http://www.romsteady.net/blog/2007/06/how-to-catch-httprequestvalidationexcep.html
sumber
Jawaban atas pertanyaan ini sederhana:
Ini akan menonaktifkan validasi untuk permintaan tertentu.
sumber
Request
?Harap diingat bahwa beberapa kontrol .NET akan secara otomatis menyandikan output HTML. Misalnya, mengatur properti .Text pada kontrol TextBox akan secara otomatis menyandikannya. Itu secara khusus berarti mengubah
<
menjadi<
,>
menjadi>
dan&
ke dalam&
. Jadi berhati-hatilah dalam melakukan ini ...Namun, properti .Text untuk HyperLink, Literal, dan Label tidak akan menyandikan hal-hal HTML, jadi bungkus Server.HtmlEncode (); sekitar apa pun yang ditetapkan pada properti ini adalah suatu keharusan jika Anda ingin mencegah
<script> window.location = "http://www.google.com"; </script>
menjadi output ke halaman Anda dan kemudian dieksekusi.Lakukan sedikit percobaan untuk melihat apa yang dikodekan dan apa yang tidak.
sumber
Dalam file web.config, di dalam tag, masukkan elemen httpRuntime dengan atribut requestValidationMode = "2.0". Juga tambahkan atribut validateRequest = "false" di elemen halaman.
Contoh:
sumber
Jika Anda tidak ingin menonaktifkan ValidateRequest, Anda perlu menerapkan fungsi JavaScript untuk menghindari pengecualian. Ini bukan pilihan terbaik, tetapi berhasil.
Kemudian dalam kode di belakang, pada acara PageLoad, tambahkan atribut ke kontrol Anda dengan kode berikutnya:
sumber
Sepertinya belum ada yang menyebutkan di bawah ini, tetapi ini memperbaiki masalah untuk saya. Dan sebelum ada yang bilang ya itu Visual Basic ... huek.
Saya tidak tahu apakah ada kerugian, tetapi bagi saya ini bekerja luar biasa.
sumber
Solusi lain adalah:
sumber
Jika Anda menggunakan framework 4.0 maka entri di web.config (<halaman validateRequest = "false" />)
Jika Anda menggunakan framework 4.5 maka entri di web.config (requestValidationMode = "2.0")
Jika Anda hanya menginginkan satu halaman saja, Dalam file aspx Anda, Anda harus meletakkan baris pertama seperti ini:
jika Anda sudah memiliki sesuatu seperti <% @ Halaman jadi tambahkan saja sisanya =>
EnableEventValidation="false"
%>Saya sarankan untuk tidak melakukannya.
sumber
Di ASP.NET, Anda dapat menangkap pengecualian dan melakukan sesuatu tentangnya, seperti menampilkan pesan ramah atau mengalihkan ke halaman lain ... Juga ada kemungkinan Anda dapat menangani validasinya sendiri ...
Tampilkan pesan ramah:
sumber
Saya kira Anda bisa melakukannya dalam modul; tetapi itu membuka beberapa pertanyaan; bagaimana jika Anda ingin menyimpan input ke database? Tiba-tiba karena Anda menyimpan data yang disandikan ke database Anda akhirnya percaya input dari itu yang mungkin merupakan ide yang buruk. Idealnya Anda menyimpan data mentah tanpa kode di dalam basis data dan penyandian setiap waktu.
Menonaktifkan proteksi pada level per halaman dan kemudian menyandikan setiap waktu adalah pilihan yang lebih baik.
Daripada menggunakan Server.HtmlEncode Anda harus melihat perpustakaan Anti-XSS yang lebih baru dan lebih lengkap dari tim Microsoft ACE.
sumber
Sebab
ASP.NET secara default memvalidasi semua kontrol input untuk konten yang berpotensi tidak aman yang dapat menyebabkan skrip lintas situs (XSS) dan injeksi SQL . Dengan demikian ia melarang konten tersebut dengan melemparkan pengecualian di atas. Secara default, direkomendasikan untuk memungkinkan pemeriksaan ini terjadi pada setiap postback.
Larutan
Pada banyak kesempatan Anda perlu mengirimkan konten HTML ke halaman Anda melalui Rich TextBoxes atau Rich Text Editor. Dalam hal ini, Anda dapat menghindari pengecualian ini dengan mengatur tag ValidateRequest dalam
@Page
arahan ke false.Ini akan menonaktifkan validasi permintaan untuk halaman yang telah Anda atur tanda ValidateRequest menjadi false. Jika Anda ingin menonaktifkan ini, periksa seluruh aplikasi web Anda; Anda harus mengaturnya ke false di bagian web.config <system.web> Anda
Untuk .NET 4.0 atau kerangka kerja yang lebih tinggi Anda harus menambahkan baris berikut di bagian <system.web> untuk membuat pekerjaan di atas.
Itu dia. Saya harap ini membantu Anda dalam menyingkirkan masalah di atas.
Referensi oleh: Kesalahan ASP.Net: Nilai Request.Form yang berpotensi berbahaya terdeteksi dari klien
sumber
Saya menemukan solusi yang menggunakan JavaScript untuk menyandikan data, yang diterjemahkan dalam .NET (dan tidak memerlukan jQuery).
Tambahkan fungsi JavaScript berikut ke tajuk Anda.
function boo () {targetText = document.getElementById ("HiddenField1"); sourceText = document.getElementById ("userbox"); targetText.value = escape (sourceText.innerText); }Di dalam textarea Anda, sertakan pertukaran yang memanggil boo ():
Akhirnya, dalam. NET, gunakan
Saya sadar bahwa ini satu arah - jika Anda perlu dua arah, Anda harus kreatif, tetapi ini memberikan solusi jika Anda tidak dapat mengedit web.config
Berikut ini adalah contoh yang saya (MC9000) buat dan gunakan melalui jQuery:
Dan markupnya:
Ini sangat bagus. Jika seorang hacker mencoba memposting melalui melewati JavaScript, mereka hanya akan melihat kesalahannya. Anda dapat menyimpan semua data yang disandikan dalam basis data juga, lalu menghapusnya (di sisi server), dan menguraikan & memeriksa serangan sebelum ditampilkan di tempat lain.
sumber
escape(...)
bisa memakan waktu lama. Dalam kasus saya, markup adalah seluruh file XML (2MB). Anda mungkin bertanya, "Mengapa Anda tidak menggunakan saja<input type="file"...
dan ... Saya setuju dengan Anda :)Solusi lain di sini bagus, namun agak menyakitkan di bagian belakang harus menerapkan [AllowHtml] untuk setiap properti Model tunggal, terutama jika Anda memiliki lebih dari 100 model di situs berukuran layak.
Jika seperti saya, Anda ingin mematikan fitur (IMHO ini tidak berguna) di situs Anda dapat mengganti metode Execute () di pengontrol dasar Anda (jika Anda belum memiliki pengontrol basis, saya sarankan Anda membuatnya, mereka dapat cukup berguna untuk menerapkan fungsi umum).
Pastikan saja Anda meng-encode semua yang dipompa ke tampilan yang berasal dari input pengguna (itu adalah perilaku default dalam ASP.NET MVC 3 dengan Razor, jadi kecuali jika karena alasan aneh Anda menggunakan Html.Raw () Anda seharusnya tidak memerlukan fitur ini.
sumber
Saya mendapatkan kesalahan ini juga.
Dalam kasus saya, pengguna memasukkan karakter beraksen
á
dalam Nama Peran (terkait penyedia keanggotaan ASP.NET).Saya meneruskan nama peran ke metode untuk memberikan Pengguna peran itu dan
$.ajax
permintaan posting gagal total ...Saya melakukan ini untuk memecahkan masalah:
Dari pada
Melakukan hal ini
@Html.Raw
melakukan trik.Saya mendapatkan nama Peran sebagai nilai HTML
roleName="Cadastro bás"
. Nilai ini dengan entitas HTMLá
sedang diblokir oleh ASP.NET MVC. Sekarang saya mendapatkan nilairoleName
parameter seperti seharusnya:roleName="Cadastro Básico"
dan mesin ASP.NET MVC tidak akan memblokir permintaan lagi.sumber
Menonaktifkan halaman validasi jika Anda benar-benar membutuhkan karakter khusus seperti,
>
,,<
, dll Kemudian memastikan bahwa ketika input pengguna ditampilkan, data yang HTML-dikodekan.Ada kerentanan keamanan dengan validasi halaman, sehingga bisa dilewati. Validasi halaman juga tidak hanya bisa diandalkan.
Lihat: http://web.archive.org/web/20080913071637/http://www.procheckup.com:80/PDFs/bypassing-dot-NET-ValidateRequest.pdf
sumber
Anda juga dapat menggunakan fungsi pelarian (string) JavaScript untuk mengganti karakter khusus. Kemudian sisi server menggunakan Server. URLDecode (string) untuk mengubahnya kembali.
Dengan cara ini Anda tidak perlu mematikan validasi input dan akan lebih jelas bagi programmer lain bahwa string mungkin memiliki konten HTML.
sumber
Saya akhirnya menggunakan JavaScript sebelum setiap postback untuk memeriksa karakter yang tidak Anda inginkan, seperti:
Memang halaman saya sebagian besar entri data, dan ada sangat sedikit elemen yang melakukan postback, tetapi setidaknya datanya tetap dipertahankan.
sumber
Anda dapat menggunakan sesuatu seperti:
Nantinya,
nvc["yourKey"]
harus bekerja.sumber
Selama ini hanya karakter "<" dan ">" (dan bukan kutipan ganda itu sendiri) dan Anda menggunakannya dalam konteks seperti <input value = " this " />, Anda aman (sedangkan untuk <textarea > yang ini </textarea> Anda tentu saja akan rentan). Itu mungkin menyederhanakan situasi Anda, tetapi untuk hal lain gunakan salah satu solusi diposting lainnya.
sumber
Jika Anda hanya ingin memberi tahu pengguna Anda bahwa <dan> tidak boleh digunakan TETAPI, Anda tidak ingin seluruh formulir diproses / diposting kembali (dan kehilangan semua input) sebelumnya, bisakah Anda tidak dengan mudah memasukkan validator di sekitar lapangan untuk menyaring karakter (dan mungkin karakter berbahaya lainnya) yang lain?
sumber
Tidak ada saran yang bekerja untuk saya. Saya tidak ingin mematikan fitur ini untuk seluruh situs web karena 99% waktu saya tidak ingin pengguna saya menempatkan HTML di formulir web. Saya baru saja membuat pekerjaan saya sendiri di sekitar metode karena saya satu-satunya yang menggunakan aplikasi khusus ini. Saya mengonversi input ke HTML dalam kode di belakang dan memasukkannya ke database saya.
sumber