Setelah ASP.NET 1.1, kemampuan untuk secara otomatis memeriksa apakah ada XSS (serangan scripting lintas situs) untuk mengirimkan formulir diperkenalkan. Ketika pengguna mencoba menggunakan input tersebut untuk mempengaruhi halaman untuk mengembalikan hasilnya, mesin ASP.NET akan memicu HTTPRequestValidationExceptionin. Secara default, halaman dengan teks berikut akan dikembalikan:
Ini adalah fitur keamanan yang sangat penting yang disediakan oleh ASP.NET. Karena banyak programmer tidak tahu tentang keamanan, dan mereka bahkan tidak tahu adanya serangan seperti XSS, bahkan lebih sedikit orang yang tahu untuk mengambil inisiatif untuk melindungi mereka. ASP.NET aman secara default pada saat ini. Ini memungkinkan pemrogram yang tidak tahu banyak tentang keamanan untuk tetap menulis situs web dengan kemampuan perlindungan keamanan tertentu.
Namun, ketika saya mencari di Google untuk mencari httpRequestValidationException atau permintaan yang berpotensi berbahaya. Nilai bentuk terdeteksi dari klien, saya terkejut menemukan bahwa solusi yang diberikan oleh kebanyakan orang adalah menonaktifkannya dengan mengatur validateRequest = false dalam deskripsi halaman ASP.NET. Fitur ini bukan untuk peduli apakah situs web programmer benar -benar tidak memerlukan fitur ini. Saya sangat takut dengan pemandangan itu. Kesadaran keamanan harus selalu ada dalam pikiran setiap programmer.
Mengapa banyak programmer ingin melarang validateRequest? Tidak perlu mengatakan ini. Bagian lain sebenarnya bukan bahwa pengguna memungkinkan input karakter yang dengan mudah menyebabkan XSS, tetapi membenci bentuk pelaporan kesalahan ini. bukan pengguna.
Untuk pemrogram yang ingin menangani pesan kesalahan ini dengan baik tanpa menggunakan pesan kesalahan pengecualian ASP.NET default, tolong jangan nonaktifkan validateRequest = false.
Cara yang benar adalah dengan menambahkan fungsi page_error () ke halaman Anda saat ini untuk menangkap semua pengecualian yang terjadi selama pemrosesan halaman tanpa pemrosesan. Kemudian beri pengguna pesan kesalahan hukum. Jika halaman saat ini tidak memiliki page_error (), pengecualian ini akan dikirim ke global.asax's application_error () untuk diproses, dan Anda juga dapat menulis fungsi penanganan kesalahan pengecualian umum di sana. Jika tidak ada fungsi penanganan pengecualian ditulis di kedua tempat, halaman laporan kesalahan default ini akan ditampilkan.
Misalnya, hanya perlu sepotong kode yang sangat singkat untuk menangani pengecualian ini. Tambahkan kode ini ke halaman-behind halaman halaman:
| Berikut ini adalah cuplikan yang dikutip: ProtectedVoidPage_error (Objectsender, EventArgse) { Exceptionex = server.getlasterror (); if (exishttpRequestValidationException) { Response.write (silakan masukkan string hukum.); Server.cleareRror (); // Jika cleareRror () bukan cleareRror (), pengecualian ini akan terus diteruskan ke application_error (). } } |
Dengan cara ini, program ini dapat mencegat pengecualian HTTPRoquestValidationException dan dapat mengembalikan pesan kesalahan yang masuk akal sesuai dengan keinginan programmer.
Kode ini sangat sederhana, jadi saya harap semua teman yang tidak benar -benar diizinkan untuk memasukkan karakter seperti pengguna, jangan melarang fitur keamanan ini sesuka hati. . Bisa.
Untuk pemrogram yang secara eksplisit melarang fitur ini, mereka harus memahami apa yang mereka lakukan dan harus secara manual memeriksa string yang harus disaring, jika tidak situs Anda akan dengan mudah memicu serangan skrip lintas situs.
Bagaimana seharusnya halaman dengan editor teks kaya ditangani?
Jika halaman memiliki kontrol dengan editor teks yang kaya, itu pasti akan mengarah pada pengiriman tag HTML kelas. Dalam hal ini, kita harus validateRequest = false. Jadi bagaimana menangani keamanan?
Menurut saran Microsoft, kita harus mengadopsi kebijakan yang disebut kebijakan berbasis keamanan, secara eksplisit diizinkan .
Pertama, kami menyandikan string input dengan httputility.htmlencode () dan sepenuhnya melarang tag HTML di dalamnya.
Kemudian, kami mengganti tag keamanan yang kami minati dan diganti dengan ganti (). Misalnya, jika kami ingin memiliki label, kami akan secara eksplisit menggantinya.
Kode sampel adalah sebagai berikut:
| Berikut ini adalah cuplikan yang dikutip: voidsubmitbtn_click (Objectsender, EventArgse) ... { // Pengkodean string input, sehingga semua tag HTML tidak valid. StringBuildersB = newstringBuilder ( Httputility.htmlencode (htmlinputtxt.text)); // Kemudian kita secara selektif mengizinkan <b> dan <i> SB.Replace (& lt; b & gt;, <b>); SB.Replace (& lt;/b & gt;,); SB.Replace (& lt; i & gt;, <i>); SB.Replace (& lt;/i & gt;,); Response.write (sb.tostring ()); } |
Dengan cara ini, kami mengizinkan beberapa tag HTML dan melarang tag berbahaya.
Menurut saran yang diberikan oleh Microsoft, kita harus hati-hati mengizinkan tag HTML berikut, karena tag HTML ini dapat menyebabkan serangan scripting lintas situs.
Berikut ini adalah cuplikan yang dikutip:
|
Mungkin hal yang paling tidak dapat dipahami di sini adalah <mmg>. Namun, setelah membaca kode berikut, Anda harus memahami bahayanya.
| Berikut ini adalah cuplikan yang dikutip: <imgsrc = javaScript: alert ('hello');> <imgsrc = java 
 skrip: alert ('hello');> <imgsrc = java 
 skrip: alert ('hello');> |
Dimungkinkan untuk menyebabkan eksekusi JavaScript melalui tag <mmg> sehingga penyerang dapat melakukan apa pun yang dia ingin menyamarkan.
Hal yang sama berlaku untuk <tyle>:
| Berikut ini adalah cuplikan yang dikutip: <styletype = text/javascript> ... waspada ('halo'); </tyle> |
| Berikut ini adalah cuplikan yang dikutip: Kesalahan server di aplikasi '/applicationPath' Permintaan yang berpotensi berbahaya. Nilai bentuk terdeteksi dari klien (txtname = <b>). Deskripsi: Validasi permintaan telah mendeteksi nilai input klien yang berpotensi berbahaya, dan pemrosesan permintaan telah dibatalkan. Dengan mengatur validateRequest = false di arahan halaman atau di bagian konfigurasi. Rincian Pengecualian: System.Web.httpRequestValidationException: Permintaan yang berpotensi berbahaya. Nilai bentuk terdeteksi dari klien (txtName = <b>). ... |