ValidateRequest = "false" tidak berfungsi di Asp.Net 4

156

Saya memiliki formulir di mana saya menggunakan ckeditor. Formulir ini berfungsi dengan baik di Asp.Net 2.0 dan 3.5 tetapi sekarang tidak berfungsi di Asp.Net 4+. Saya memiliki arahan ValidateRequest = "false". Ada saran?

HasanG
sumber
Ada artikel singkat tentang memberikan kontrol validasi dengan benar jika ada yang peduli: Validasi Galat di .NET 4
Ian
Adakah yang bisa tolong beri tahu saya apa kekurangan menggunakan ValidationRequest = false?
fc123

Jawaban:

194

Ditemukan solusi di halaman kesalahan. Hanya perlu menambahkan requestValidationMode = "2.0"

<system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime requestValidationMode="2.0" />
</system.web>

Informasi MSDN: HttpRuntimeSection.RequestValidationMode Property

HasanG
sumber
1
itu luar biasa, tetapi apakah ada yang tahu cara mengatur ini per halaman? Juga bagaimana saya meletakkan ini di web.config sehingga masih akan bekerja dengan .NET 2?
MK.
1
@MK: Saya rasa tidak ada arahan halaman untuk pengaturan ini. Anda tidak dapat membuatnya berjalan di. Net 2. Saya pikir itu tidak perlu. Karena Anda hanya dapat membangun aplikasi web yang hanya menargetkan satu versi kerangka kerja. Cukup salin baris ini ke .net 4 web.config yang membutuhkannya ...
HasanG
2
Tetapi apa yang telah berubah dalam validasi untuk .net 4? Apakah ada cara untuk melakukannya tanpa mengubah mode validasi?
Diam
4
@Sly: Anda dapat menemukan jawabannya di sini: asp.net/learn/whitepapers/aspnet4/…
HasanG
adakah yang bisa memberitahu saya mengapa aplikasi asp.net 4.0 menggunakan requestValidationMode = "2.0" adalah ide yang bagus?
fc123
102

Ada cara untuk mengembalikan validasi ke 2.0 untuk satu halaman. Cukup tambahkan kode di bawah ini ke web.config Anda:

<configuration>
    <location path="XX/YY">
        <system.web>
            <httpRuntime requestValidationMode="2.0" />
        </system.web>
    </location>

    ...
    the rest of your configuration
    ...

</configuration>
Ben Hoffman
sumber
Lokasi adalah jalur apa pun, dan didasarkan pada simpul apa pun di bawah folder yang Anda tentukan di pohon.
DFTR
7
Ini adalah solusi yang lebih baik daripada jawaban yang diterima karena ini bukan aplikasi yang lebar, melainkan sempit untuk lingkup spesifik yang Anda tentukan di jalur lokasi
Charles Wesley
5
Deklarasi <location ..> di atas harus ditempatkan di dalam deklarasi <configuration> tetapi tidak bersarang lebih jauh.
rbassett
1
Pengaturan per halaman sepertinya tidak berfungsi untuk proyek yang menargetkan .NET 4.6.1.
Dennis T --Reinstate Monica--
56

Saya tahu ini adalah pertanyaan lama, tetapi jika Anda menemukan masalah ini di MVC 3 maka Anda dapat menghiasnya ActionMethoddengan [ValidateInput(false)]dan matikan saja validasi permintaan untuk satu ActionMethod, yang berguna. Dan Anda tidak perlu membuat perubahan apa pun pada web.configfile tersebut, sehingga Anda masih dapat menggunakan validasi .NET 4 request di tempat lain.

misalnya

[ValidateInput(false)]
public ActionMethod Edit(int id, string value)
{
    // Do your own checking of value since it could contain XSS stuff!
    return View();
}
Tom Chantler
sumber
1
@RossCooper ini hanya untuk asp.net MVC
mxmissile
28

Ini berfungsi tanpa mengubah mode validasi.

Anda harus menggunakan System.Web.Helpers.Validation.Unvalidatedpembantu dari System.Web.WebPages.dll. Ini akan mengembalikan UnvalidatedRequestValuesobjek yang memungkinkan untuk mengakses formulir dan QueryString tanpa validasi.

Sebagai contoh,

var queryValue = Server.UrlDecode(Request.Unvalidated("MyQueryKey"));

Bekerja untuk saya untuk MVC3 dan .NET 4.

Pembunuh
sumber
1
Bisakah Anda memberikan contoh cara mengambil queryString dengan metode ini? Saya terus mendapatkan 'Tidak Divalidasi bukan anggota ...' semua objek yang saya coba tambahkan. Saya pikir saya mungkin melewatkan sebuah menyertakan
CodedMonkey
3
var queryValue = Server.UrlDecode (Request.Unvalvalated ("MyQueryKey"));
sfuqua
1
Ini pastinya jawaban yang diterima. Menjaga keamanan dan sangat fleksibel karena Anda dapat menggunakannya secara selektif.
cmartin
Untuk Formulir Web Anda harus mengganti entri dalam koleksi QueryString untuk menghindari kesalahan validasi-lihat Permintaan yang berpotensi berbahaya. Nilai
Michael Freidgeim
15

Perhatikan bahwa pendekatan lain adalah untuk tetap dengan perilaku validasi 4.0, tetapi untuk menentukan kelas Anda sendiri yang berasal dari RequestValidatordan mengatur:

<httpRuntime requestValidationType="YourNamespace.YourValidator" />

(Di mana YourNamespace.YourValidatoryang baik, Anda harus bisa menebak ...)

Dengan cara ini Anda menjaga keunggulan perilaku 4.0s (khususnya, bahwa validasi terjadi lebih awal dalam pemrosesan), sementara juga memungkinkan permintaan yang harus Anda biarkan masuk, melaluinya.

Jon Hanna
sumber
7
Ini bagus untuk diketahui. Tapi saya masih berpikir seluruh fitur validasi permintaan ASP.Net salah arah. Input itu sendiri bukan masalah, itu yang Anda lakukan dengannya. Ini bisa sangat valid untuk menerima kode SQL, HTML, atau JavaScript sebagai input ke aplikasi Anda, selama Anda meng-encode / melarikan diri dengan benar sebelum Anda output atau menyimpannya di database Anda.
Jordan Rieger
2
@JordanRieger Saya setuju sebagian. OOTB, setidaknya memiliki keuntungan dari defaulting untuk mengamankan (jangan memikirkan semuanya dan Anda mendapatkan kesalahan, daripada 0wned), tapi itu sedikit gangguan dan perilaku pra-4.0 sangat semua atau tidak sama sekali. Ada sesuatu dengan kemampuan untuk memiliki lapisan validasi yang digunakan sebelum pemrosesan lainnya, seperti dengan permintaan requestValidationType, tetapi banyak validasi perlu lebih terikat dengan pemrosesan lainnya. Secara keseluruhan saya pikir itu lebih untuk melindungi orang dengan kebiasaan buruk dari beberapa (tetapi tidak semua) perpecahan daripada untuk mendorong kebiasaan baik.
Jon Hanna