ValidateRequest = “false” Asp.Net 4'te çalışmıyor


156

Ckeditor kullandığım bir form var. Bu form Asp.Net 2.0 ve 3.5'de iyi çalıştı, ancak şimdi Asp.Net 4+'da çalışmıyor. ValidateRequest = "false" yönergesine sahibim. Baska öneri?


Doğrulama denetimlerini düzgün bir şekilde oluşturma hakkında kısa bir makale vardır: Herkesin umurunda
Ian

Herkes lütfen ValidationRequest = false kullanmanın sakıncaları nelerdir?
fc123

Yanıtlar:


194

Hata sayfasında çözüm bulundu. Sadece requestValidationMode = "2.0" eklemek gerekiyor

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

MSDN bilgileri: HttpRuntimeSection.RequestValidationMode Özelliği


1
bu harika, ama herkes bunu sayfa başına ayarlamak için bir yol biliyor mu? Ayrıca bunu hala .NET 2 ile çalışacak şekilde web.config dosyasına nasıl koyabilirim?
MK.

1
@MK: Bu ayar için bir sayfa yönergesi olduğunu sanmıyorum. .Net 2 üzerinde çalıştıramazsınız. Bunun gerekli olacağını düşünmüyorum. Çünkü sadece bir çerçeve sürümünü hedefleyen bir web uygulaması oluşturabilirsiniz. Bu satırı .net 4 web.config dosyasına ihtiyaç duyan kopyalayın ...
HasanG

2
Peki .net 4 için doğrulamada ne değişti? Doğrulama modunu değiştirmeden yapmanın bir yolu var mı?
Sinsi

4
@Sly: Cevabı burada bulabilirsiniz: asp.net/learn/whitepapers/aspnet4/…
HasanG

Herkes lütfen asp.net 4.0 uygulamasında requestValidationMode = "2.0" kullanarak neden iyi bir fikir olduğunu bana bildirin?
fc123

102

Bir sayfa için doğrulamayı tekrar 2.0'a çevirmenin bir yolu var. Aşağıdaki kodu web.config dosyasına eklemeniz yeterlidir:

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

    ...
    the rest of your configuration
    ...

</configuration>

Konum herhangi bir yoldur ve ağaçta belirttiğiniz klasörün altındaki herhangi bir düğüme dayanır.
DFTR

7
Bu, kabul edilen yanıttan daha iyi bir çözümdür, çünkü konum yolunda tanımladığınız belirli kapsamla oldukça dar bir uygulama değildir
Charles Wesley

5
Yukarıdaki <location ..> bildirimi, <configuration> bildiriminin içine yerleştirilmeli ancak daha fazla iç içe yerleştirilmemelidir.
rbassett

1
Sayfa başına ayar, .NET 4.6.1'i hedefleyen projeler için çalışmıyor gibi görünüyor.
Dennis T - Monica'yı eski durumuna getir

56

Bu eski bir soru olacak ama MVC 3'te bu sorunla karşılaşırsanız eğer o zaman dekore edebilirsiniz ActionMethodile [ValidateInput(false)]ve sadece tek bir isteği doğrulama kapatmak ActionMethodkullanışlı olan. Ve web.configdosyada herhangi bir değişiklik yapmanız gerekmez , böylece .NET 4 istek doğrulamasını başka her yerde kullanabilirsiniz.

Örneğin

[ValidateInput(false)]
public ActionMethod Edit(int id, string value)
{
    // Do your own checking of value since it could contain XSS stuff!
    return View();
}

1
@RossCooper bu sadece asp.net MVC içindir
mxmissile

28

Bu, doğrulama modunu değiştirmeden çalışır.

System.Web.Helpers.Validation.UnvalidatedAdlı kişiden bir yardımcı kullanmanız gerekiyor System.Web.WebPages.dll. UnvalidatedRequestValuesForma ve QueryString'e doğrulama olmadan erişmeye izin veren bir nesne döndürecektir .

Örneğin,

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

MVC3 ve .NET 4 için benim için çalışıyor.


1
Bu yöntemle bir queryString öğesinin nasıl alınacağına ilişkin bir örnek verebilir misiniz? Eklemeye çalıştığım tüm nesneleri 'Onaylanmamış bir üye değil ...' elde etmeye devam ediyorum. Sanırım bir
eklenti

3
var queryValue = Sunucu.UrlDecode (Request.Unvalidated ("MyQueryKey"));
sfuqua

1
Bu kesinlikle kabul edilen cevap olmalı. Güvenliği korur ve seçici olarak kullanabileceğiniz için son derece esnektir.
cmartin

Web Formları için, önlemek doğrulama için QueryString koleksiyonunda girişini değiştirmek zorunda hata görülmesi asp.net sayfasına jQuery sonrası çağrısından html biçimlendirme gönderirken tehlikeli İstek.SorgulamaDizesi değeri istemciden algılandı A
Michael Freidgeim

15

Başka bir yaklaşımın 4.0 doğrulama davranışına uymak, ancak türetilmiş RequestValidatorve ayarlanmış kendi sınıfınızı tanımlamak olduğunu unutmayın :

<httpRuntime requestValidationType="YourNamespace.YourValidator" />

(nerede YourNamespace.YourValidatorolduğunu tahmin edebilmelisiniz ...)

Bu şekilde 4.0'ların davranışının avantajlarını (özellikle, doğrulamanın işlemenin daha erken aşamalarında gerçekleştiğini) korurken aynı zamanda izin vermeniz gereken isteklere de izin verirsiniz.


7
Bunu bilmek güzel. Ancak ASP.Net'in tüm istek doğrulama özelliğinin yanlış yönlendirildiğini düşünüyorum. Girdinin kendisi problem değil, onunla ne yaparsınız . SQL, HTML veya JavaScript kodunu, çıktısını almadan veya veritabanınıza kaydetmeden önce düzgün bir şekilde kodladığınız / kaçtığınız sürece uygulamanızın girdisi olarak kabul etmek tamamen geçerli olabilir.
Jordan Rieger

2
@JordanRieger Kısmen katılıyorum. OOTB, en azından güvenli hale getirme avantajına sahiptir (şeyleri düşünmeyin ve 0wned yerine hatalar alırsınız), ancak biraz rahatsız edici ve 4.0 öncesi davranış çok ya hep ya hiç. Özel bir requestValidationType öğesinde olduğu gibi, diğer işlemlerden önce kullanılan bir doğrulama katmanına sahip olma yeteneği vardır, ancak birçok doğrulama diğer işlemlerle daha fazla ilişkilendirilmelidir. Sonuçta kötü alışkanlıkları olan insanları bazı (ama hepsi değil) bölünmelerden korumak iyi alışkanlıkları teşvik etmekten daha fazlasını yapar.
Jon Hanna
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.