Pertanyaan Nilai Request.Form yang berpotensi berbahaya terdeteksi dari klien


Setiap kali pengguna memposting sesuatu yang mengandung < atau > di halaman di aplikasi web saya, saya mendapatkan pengecualian ini.

Saya tidak ingin membahas tentang kecerdasan melemparkan pengecualian atau menabrak seluruh aplikasi web karena seseorang memasukkan karakter dalam kotak teks, tetapi saya mencari cara elegan untuk menangani ini.

Menjebak pengecualian dan ditampilkan

Terjadi kesalahan, harap kembali dan ketik ulang seluruh formulir Anda lagi, tetapi kali ini jangan gunakan <

tampaknya tidak cukup profesional untuk saya.

Menonaktifkan validasi postingan (validateRequest="false") pasti akan menghindari kesalahan ini, tetapi akan membuat halaman rentan terhadap sejumlah serangan.

Idealnya: Ketika posting kembali terjadi mengandung karakter HTML terbatas, bahwa nilai yang diposting dalam koleksi Formulir akan secara otomatis dikodekan HTML. Sehingga .Text milik kotak teks saya akan something & lt; html & gt;

Apakah ada cara saya dapat melakukan ini dari seorang pawang?


1324
2017-09-17 10:58


asal


Jawaban:


Saya pikir Anda menyerangnya dari sudut yang salah dengan mencoba menyandikan semua data yang diposting.

Perhatikan bahwa "<"Bisa juga berasal dari sumber luar lain, seperti bidang basis data, konfigurasi, file, feed dan sebagainya.

Selanjutnya, "<"tidak berbahaya secara inheren. Ini hanya berbahaya dalam konteks tertentu: ketika menulis string yang belum dikodekan ke output HTML (karena XSS).

Dalam konteks lain, sub-string yang berbeda berbahaya, misalnya, jika Anda menulis URL yang disediakan pengguna ke dalam tautan, sub-string "javascript:"Mungkin berbahaya. Karakter kutipan tunggal di sisi lain berbahaya ketika string interpolasi dalam kueri SQL, tetapi sangat aman jika itu adalah bagian dari nama yang dikirimkan dari formulir atau dibaca dari bidang basis data.

Intinya adalah: Anda tidak dapat menyaring input acak untuk karakter berbahaya, karena karakter apa pun mungkin berbahaya dalam situasi yang tepat. Anda harus mengkodekan pada titik di mana beberapa karakter tertentu dapat menjadi berbahaya karena mereka menyeberang ke sub-bahasa yang berbeda di mana mereka memiliki arti khusus. Ketika Anda menulis string ke HTML, Anda harus mengkodekan karakter yang memiliki arti khusus dalam HTML, menggunakan Server.HtmlEncode. Jika Anda mengirimkan string ke pernyataan SQL dinamis, Anda harus menyandikan karakter yang berbeda (atau lebih baik, biarkan kerangka melakukannya untuk Anda dengan menggunakan pernyataan siap atau sejenisnya) ..

Kapan Anda yakin Anda mengkodekan HTML di mana pun Anda melewatkan string ke HTML, lalu atur validateRequest="false" dalam <%@ Page ... %> direktif dalam Anda .aspx file (s).

Di .NET 4 Anda mungkin perlu melakukan sedikit lebih banyak. Terkadang perlu juga ditambahkan <httpRuntime requestValidationMode="2.0" /> ke web.config (referensi).


995
2017-09-17 11:26



Ada solusi berbeda untuk kesalahan ini jika Anda menggunakan ASP.NET MVC:

C # sampel:

[HttpPost, ValidateInput(false)]
public ActionResult Edit(FormCollection collection)
{
    // ...
}

Contoh Visual Basic:

<AcceptVerbs(HttpVerbs.Post), ValidateInput(False)> _
Function Edit(ByVal collection As FormCollection) As ActionResult
    ...
End Function

467
2017-10-08 22:56



Di ASP.NET MVC (mulai di versi 3), Anda dapat menambahkan AllowHtml atribut ke properti pada model Anda.

Ini memungkinkan permintaan untuk menyertakan markup HTML selama pengikatan model dengan melompati validasi permintaan untuk properti.

[AllowHtml]
public string Description { get; set; }

361
2017-09-05 09:33



Jika Anda berada di. NET 4.0 pastikan Anda menambahkan ini di blog Anda web.config file di dalam <system.web> tag:

<httpRuntime requestValidationMode="2.0" />

Di. NET 2.0, permintaan validasi hanya berlaku untuk aspx permintaan. Di .NET 4.0 ini diperluas untuk disertakan semua permintaan. Anda dapat kembali ke hanya melakukan validasi XSS saat memproses .aspx dengan menentukan:

requestValidationMode="2.0"

Anda dapat menonaktifkan permintaan validasi sepenuhnya dengan menentukan:

validateRequest="false"

202
2017-07-30 04:51



Untuk ASP.NET 4.0, Anda dapat membolehkan markup sebagai masukan untuk halaman tertentu, bukan seluruh situs dengan meletakkan semuanya dalam a <location> elemen. Ini akan memastikan semua halaman Anda yang lain aman. Anda TIDAK perlu menempatkan ValidateRequest="false" di halaman .aspx Anda.

<configuration>
...
  <location path="MyFolder/.aspx">
    <system.web>
      <pages validateRequest="false" />
      <httpRuntime requestValidationMode="2.0" />
    </system.web>
  </location>
...
</configuration>

Lebih aman untuk mengontrol ini di dalam web.config Anda, karena Anda dapat melihat pada tingkat situs yang halaman memungkinkan markup sebagai masukan.

Anda masih perlu memvalidasi masukan secara terprogram pada halaman di mana validasi permintaan dinonaktifkan.


102
2017-11-27 17:22



Jawaban sebelumnya bagus, tetapi tidak ada yang mengatakan bagaimana mengecualikan satu bidang dari yang divalidasi untuk suntingan HTML / JavaScript. Saya tidak tahu tentang versi sebelumnya, tetapi di MVC3 Beta Anda dapat melakukan ini:

[HttpPost, ValidateInput(true, Exclude = "YourFieldName")]
public virtual ActionResult Edit(int id, FormCollection collection)
{
    ...
}

Ini masih memvalidasi semua bidang kecuali yang dikecualikan. Hal yang baik tentang ini adalah bahwa atribut validasi Anda masih memvalidasi bidang, tetapi Anda tidak mendapatkan "Sebuah nilai Request.Form yang berpotensi berbahaya terdeteksi dari klien" pengecualian.

Saya telah menggunakan ini untuk memvalidasi ekspresi reguler. Saya telah membuat ValidationAttribute saya sendiri untuk melihat apakah ekspresi reguler valid atau tidak. Karena ekspresi reguler dapat berisi sesuatu yang tampak seperti skrip saya menerapkan kode di atas - ekspresi reguler masih diperiksa apakah valid atau tidak, tetapi tidak jika itu berisi skrip atau HTML.


68
2017-11-06 14:58



Di ASP.NET MVC Anda perlu mengatur requestValidationMode = "2.0" dan validateRequest = "false" di web.config, dan menerapkan atribut ValidateInput ke aksi kontroler Anda:

<httpRuntime requestValidationMode="2.0"/>

<configuration>
    <system.web>
        <pages validateRequest="false" />
    </system.web>
</configuration>

dan

[Post, ValidateInput(false)]
public ActionResult Edit(string message) {
    ...
}

46
2017-11-30 12:56