Tehlikeli olabilecek bir Request.Form değeri istemciden tespit edildi


1471

Bir kullanıcı mesaj şey içeren her zaman <ya >benim web uygulaması bir sayfada, ben atılan bu istisna olsun.

Birisi bir metin kutusuna bir karakter girdiği için istisna atmanın veya tüm bir web uygulamasını kilitlemenin akıllılığıyla ilgili tartışmaya girmek istemiyorum, ancak bunu ele almak için zarif bir yol arıyorum.

İstisnayı yakalama ve gösterme

Bir hata oluştu, lütfen geri dönün ve formunuzun tamamını tekrar yazın, ancak bu sefer lütfen <

bana yeterince profesyonel gelmiyor.

Sonradan doğrulamayı ( validateRequest="false") devre dışı bırakmak kesinlikle bu hatayı önleyecektir, ancak sayfayı bir dizi saldırıya karşı savunmasız bırakacaktır.

İdeal olarak: HTML kısıtlamalı karakterler içeren bir geri gönderme gerçekleştiğinde, Form koleksiyonundaki bu gönderilen değer otomatik olarak HTML kodlu olur. Yani .Textbenim metin kutusunun özelliği olacaksomething & lt; html & gt;

Bunu bir işleyiciden yapabilmemin bir yolu var mı?


68
Girişinizde HTML varlık adları (& amp;) veya varlık numaraları (& # 39;) varsa bu hatayı alabileceğinizi unutmayın.
Drew Noakes

18
Benim sorum olduğu için, noktanın gerçekte ne olduğunu tanımlayabildiğimi hissediyorum: tüm uygulama sürecini çökertmek ve genel bir hata mesajı döndürmek çünkü biri '<' yazmış biri aşırıya kaçmış. Özellikle bildiğiniz için çoğu insan ondan kurtulmak için sadece 'validateRequest = false' olacak, böylece güvenlik açığını yeniden
açacaksınız

7
@DrewNoakes: varlık adları (& amp;) testlerime göre (.Net 4.0'da test edildi) bir sorun gibi görünmese de, varlık numaraları (& # 39;) doğrulamada başarısız oldu (dediğin gibi). Net Reflector kullanarak System.Web.CrossSiteScriptingValidation.IsDangerousString yöntemini
sökerseniz

5
Varsayılan MVC projesini kullanarak VS2014'te yeni bir site oluşturun ve çalıştırın. Kayıt bağlantısını tıklayın, herhangi bir e-posta ekleyin ve "<P455-0r [!" şifre olarak. Kutusundan çıkan aynı hata, kötü amaçlı bir şey yapmaya çalışmayan, şifre alanı görüntülenmeyecek, bu yüzden bir XSS saldırısı olmayacak, ancak bunu düzeltmenin tek yolu ValidateInput (false) ile doğrulamayı tamamen kaldırmaktır ? AllowHtml önerisi bu durumda çalışmaz, yine de aynı hatayla patladı. Tehlikeli olabilecek bir Request.Form değeri istemciden saptandı (Parola = "<P455-0r [!").
stephenbayer

TL; DR <httpRuntime requestValidationMode="2.0" />web.config'e

Yanıtlar:


1080

Gönderilen tüm verileri kodlamaya çalışarak yanlış açıdan saldırdığını düşünüyorum.

" <" İfadesinin, veritabanı alanı, yapılandırma, dosya, yayın vb. Gibi diğer dış kaynaklardan da gelebileceğini unutmayın .

Ayrıca, " <" doğası gereği tehlikeli değildir. Yalnızca belirli bir bağlamda tehlikelidir: HTML çıktısına kodlanmamış dizeler (XSS nedeniyle) yazarken.

Diğer bağlamlarda farklı alt dizeler tehlikelidir; örneğin, bir bağlantıya kullanıcı tarafından sağlanan bir URL yazarsanız, " javascript:" alt dizesi tehlikeli olabilir. Öte yandan tek tırnak karakteri SQL sorgularında dizeleri enterpolasyon yaparken tehlikelidir, ancak formdan gönderilen veya veritabanı alanından okunan bir adın bir parçası olması durumunda tamamen güvenlidir.

Sonuç olarak, tehlikeli karakterler için rastgele girdilere filtre uygulayamazsınız, çünkü herhangi bir karakter doğru koşullar altında tehlikeli olabilir. Bazı belirli karakterlerin tehlikeli olabileceği bir noktada kodlama yapmalısınız, çünkü özel anlamları olan farklı bir alt dile geçerler. HTML'ye bir dize yazdığınızda, Server.HtmlEncode kullanarak HTML'de özel bir anlamı olan karakterleri kodlamanız gerekir. Dinamik bir SQL ifadesine bir dize iletirseniz, farklı karakterleri kodlamanız gerekir (veya daha iyisi, hazırlanmış ifadeler veya benzerlerini kullanarak çerçevenin sizin için yapmasına izin vermeniz gerekir).

Ne zaman sen HTML dizeleri geçmesi her yerde emin HTML kodlamasını, o zaman set validateRequest="false"içinde <%@ Page ... %>sizin de direktif .aspxdosyası (ler).

.NET 4'te biraz daha fazlasını yapmanız gerekebilir. Bazen <httpRuntime requestValidationMode="2.0" />web.config'e ( başvuru ) da eklemek gerekebilir .


74
Geç gelenlere: validateRequest = "false" Sayfa yönergesine (.aspx dosyanızın ilk satırı) gider
MGOwen

56
İpucu: <httpRuntime requestValidationMode="2.0" />Sitenizin geri kalanından doğrulama ile sağlanan yararlı korumayı öldürmemek için bir konum etiketi yerleştirin.
Brian

297
MVC3'te, bu [AllowHtml]model özelliğindedir.
Jeremy Holovacs

2
MVC 3 için küresel olarak devre dışı bırakmak için de ihtiyacınız GlobalFilters.Filters.Add(new ValidateInputAttribute(false));var Application_Start().
Alex

15
@MGOwen, sayfa yönergesini <pages validateRequest="false" />in <system.web />. Yoluyla web.config dosyasına ekleyebilirsiniz . Bunu yaptığınızda mülk tüm sayfalara uygulanır.
oliver-clare

504

ASP.NET MVC kullanıyorsanız, bu hatanın farklı bir çözümü vardır:

C # örneği:

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

Visual Basic örneği:

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

tüm uygulamanın bir sayfasında ihtiyaç olduğunda sorun olabilir

3
Sınıf düzeyinde [ValidateInput (false)] niteliğini de ekleyebilirsiniz. Temel denetleyici sınıfınıza eklerseniz, tüm denetleyici yöntemi eylemlerine uygulanır.
Shan Plourde

@Zack Çözüm için teşekkürler. Öte yandan ben [AllowHtml]daha iyi olup olmadığını merak ediyorum ValidateInput(false), çünkü bir [AllowHtml]kerede bir özellik yani Editör alanı için tanımlanır ve ne zaman kullanılırsa birkaç eylem için kullanmaya gerek yoktur. Sen ne önerirsin?
Jack

@Zack Peterson Kullanımı güvenli mi? Güvenlik sorunu yok mu?
shrey Pav

416

ASP.NET MVC'de (sürüm 3'ten başlayarak), AllowHtmlözniteliği modelinizdeki bir özelliğe ekleyebilirsiniz .

Özelliğin istek doğrulamasını atlayarak bir isteğin model bağlama sırasında HTML işaretlemesi içermesine izin verir.

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

12
Bunu deklaratif olarak kontrolörden yapmak çok daha iyi!
Andiih

29
Tek doğru cevap! denetleyici eyleminde doğrulamayı devre dışı bırakmak hacky. Ayrıca, uygulama düzeyinde doğrulamayı devre dışı bırakmak için geliştiricilerin askıda kalması gerekir!
trailmax

Bu MVC 4'te kayboldu mu?
granadaCoder

1
Arasındaki fark nedir ValidateInput(false)ve AllowHtml? Birinin diğerine göre avantajı nedir? Ne zaman ı kullanmak isteyeyim AllowHtmlyerine ValidateInput(false)? Ne zaman ı kullanmak isteyeyim ValidateInput(false)üzerinde AllowHtml? Her ikisini ne zaman kullanmak isterim? Her ikisini de kullanmak mantıklı mı?
Ian Boyd

3
ValidateInput yöntemde, AllowHtml modelin mülkiyetindedir - bu yüzden sadece html olmasını beklediğiniz kişiye izin verirsiniz - hepsi değil
Anthony Johnston

213

.NET 4.0 kullanıyorsanız, bunu web.config dosyanıza <system.web>etiketlerin içine eklediğinizden emin olun :

<httpRuntime requestValidationMode="2.0" />

.NET 2.0'da, istek doğrulama yalnızca aspxisteklere uygulanır . .NET 4.0'da bu, tüm istekleri içerecek şekilde genişletildi . İşlem yaparken yalnızca XSS doğrulaması gerçekleştirmeye geri dönerek şunları belirtebilirsiniz .aspx:

requestValidationMode="2.0"

Aşağıdakileri belirterek istek doğrulamayı tamamen devre dışı bırakabilirsiniz :

validateRequest="false"

30
İçinde <system.web>etiketleri.
Hosam Aly

8
Bunu web.config dosyasına koydum, ancak yine de "Potansiyel olarak tehlikeli bir Request.Form değeri" hatasını alıyorum
Filip

20
Görünüşe göre <httpRuntime requestValidationMode = "2.0" /> yalnızca makineye 2.0 çerçevesi yüklendiğinde çalışır. 2.0 çerçevesi hiç yüklenmemişse, yalnızca 4.0 çerçevesi yüklenmişse ne olur?
Samuel

Bu tamamen benim için çalıştı. Diğer cevaplardaki adımlar belgesinin hiçbiri gerekli değildi (validateRequest = "false" dahil)!
tom redfern

112

ASP.NET 4.0 için, tümünü bir <location>öğeye koyarak sitenin tamamı yerine belirli sayfalar için girdi olarak işaretlemeye izin verebilirsiniz . Bu, diğer tüm sayfalarınızın güvende olmasını sağlayacaktır. ValidateRequest="false".Aspx sayfanıza yerleştirmeniz GEREKMEZ .

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

Bunu web.config içinde kontrol etmek daha güvenlidir, çünkü site düzeyinde hangi sayfaların girdi olarak işaretlemeye izin verdiğini görebilirsiniz.

Hala istek doğrulamanın devre dışı bırakıldığı sayfalarda girişi programlı olarak doğrulamanız gerekir.


RequestValidationMode = 2 | 4 hakkında daha fazla bilgi burada: msdn.microsoft.com/en-us/library/…
GlennG

Ne yazık ki bu ASP.net 2.0 ile olduğu gibi çalışmaz. HttpRuntime satırını kaldırın ve çalışacaktır.
Fandango68

Doğrulama devre dışı bırakıldığında kişilerin girişi manuel olarak doğrulamasını hatırlatan bir uyarı ekledim.
Carter Medlin

72

Önceki cevaplar harika, ancak kimse tek bir alanın HTML / JavaScript enjeksiyonları için nasıl doğrulanacağını nasıl hariç tutacağını söylemedi. Önceki sürümleri bilmiyorum, ancak MVC3 Beta'da bunu yapabilirsiniz:

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

Bu, hariç tutulan alan dışındaki tüm alanları hala doğrular. Bununla ilgili güzel bir şey, doğrulama özelliklerinizin hala alanı doğrulamasıdır, ancak "İstemciden potansiyel olarak tehlikeli bir Request.Form değeri algılandı" istisnalarını almazsınız.

Bunu normal bir ifadeyi doğrulamak için kullandım. Düzenli ifadenin geçerli olup olmadığını görmek için kendi ValidationAttribute yaptım. Normal ifadeler bir komut dosyası gibi görünen bir şey içerebileceğinden, yukarıdaki kodu uyguladım - normal ifade geçerli olup olmadığını kontrol ediyor, ancak komut dosyaları veya HTML içeriyorsa kontrol edilmiyor.


10
Ne yazık ki Hariç tutma özelliği MVC 3 RTW'den kaldırılmış gibi görünüyor :(
Matt Greer

2
MVC 4'e de dahil değildi
wilsjd

9
Kullanım [AllowHtml]modelin özelliklerine yerine [ValidateInput]aynı sonuç elde etmek Eylem üzerinde.
Mrchief

2
@Christof Cevabımın 5 yaşında olduğuna dikkat edin. Bu sorunla uzun zamandır karşılaşmadım, bu yüzden onunla başa çıkmanın çok daha iyi yolları olabilir. Bu iki seçenekle ilgili olarak durumunuza bağlı olduğunu düşünüyorum. Belki de bu modeli birden fazla eylemde ve bazı yerlerde HTML'ye izin verilip verilmediğini gösterebilirsiniz. Böyle bir durumda [AllowHtml]bir seçenek yoktur. Bu makaleye göz atmanızı tavsiye ederim: weblogs.asp.net/imranbaloch/… , ama bu da biraz eski ve güncel olmayabilir.
gligoran

1
Hala belirli yöntem parametrelerini doğrulamadan hariç tutmanın bir yolu var, cevabımı buradan kontrol edin: stackoverflow.com/a/50796666/56621
Alex

51

ASP.NET MVC'de web.config dosyasında requestValidationMode = "2.0" ve validateRequest = "false" ayarlamanız ve denetleyici eyleminize bir ValidateInput özniteliği uygulamanız gerekir:

<httpRuntime requestValidationMode="2.0"/>

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

ve

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

2
Benim için validateRequest="false", sadece gerekli değildirequestValidationMode="2.0"
tom redfern

requestValidationMode = "2.0" hala HTML kodlanmış verilerde hata oluşturur. Base64 dışında hiçbir çözüm her şeyi kodlamaz, sonra gönderir.
MC9000

48

Sen edebilirsiniz kodlamak HTML metin kutusu içeriğini, fakat maalesef bu oluyor istisna durmayacak. Benim tecrübelerime göre, bunun bir yolu yok ve sayfa doğrulamayı devre dışı bırakmanız gerekiyor. Bunu yaparak: "Dikkatli olacağım, söz veriyorum" diyorsunuz.


43

MVC için, giriş doğrulamasını ekleyerek yok sayın

[ValidateInput (yalancı)]

Denetleyicideki her Eylemin üstünde.


Bu, yapılandırılmış bir yol üzerinden denetleyici yöntemine ulaşması durumunda işe yaramaz gibi görünüyor.
PandaWood

Aslında teknik açıklama, hakaret karakter "sorgusu dizesi" olduğunda bu istek yolunda ise bu sadece ... işlediği, ya Doğrulama nitelik değil
PandaWood

42

Bu hatayı Global.asax'ta yakalayabilirsiniz. Hala doğrulamak istiyorum, ancak uygun bir mesaj gösterdim. Aşağıda listelenen blogda, bunun gibi bir örnek mevcuttu.

    void Application_Error(object sender, EventArgs e)
    {
        Exception ex = Server.GetLastError();

        if (ex is HttpRequestValidationException)
        {
            Response.Clear();
            Response.StatusCode = 200;
            Response.Write(@"[html]");
            Response.End();
        }
    }

Başka bir sayfaya yönlendirme de istisnaya makul bir yanıt gibi görünüyor.

http://www.romsteady.net/blog/2007/06/how-to-catch-httprequestvalidationexcep.html


40

Bu sorunun cevabı basit:

var varname = Request.Unvalidated["parameter_name"];

Bu, belirli bir istek için doğrulamayı devre dışı bırakır.


1
Yalnızca ASP.NET 4.5 (ve muhtemelen ondan sonra ne gelecekse) için geçerlidir. Pre 4.5 bunu desteklemez.
Beska

3
Keşke bu şekilde yukarı çıkabilseydim. .NET 4.5 kullanıyorum ve MVC kullanmıyorum ve web.config değiştiremiyorum beri tam olarak gereken bu.
Chris Gillum

1
Evet ama .Net 2 kullanıyorsanız? Bazılarımızın başka seçeneği yok
Fandango68

bu POST veya GET parametreleri alır?
max4ever

Bunun atılmış bir istisnayı önlediğini mi söylüyorsunuz? Veya .net 4.5, veriler gerçekte okunana kadar özel durumu ve doğrulamayı geciktirir Requestmi?
ebyrob

34

Bazı .NET denetimlerinin çıktıyı otomatik olarak HTML kodlayacağını lütfen unutmayın. Örneğin, bir TextBox denetiminde .Text özelliğini ayarlamak otomatik olarak kodlar. Bu özellikle, <içine &lt;, >içine &gt;ve &içine dönüştürme anlamına gelir &amp;. Bu yüzden dikkatli olun ...

myTextBox.Text = Server.HtmlEncode(myStringFromDatabase); // Pseudo code

Ancak, HyperLink, Literal ve Label için .Text özelliği HTML öğelerini kodlamaz, bu nedenle Server.HtmlEncode (); <script> window.location = "http://www.google.com"; </script>sayfanıza çıktı alınmasını ve sonradan yürütülmesini önlemek istiyorsanız, bu özelliklerde ayarlanan her şeyin bir zorunluluktur .

Neyin kodlandığını ve neyin kodlanmadığını görmek için biraz deneme yapın.


29

Web.config dosyasına, etiketlerin içine, requestValidationMode = "2.0" özelliğine sahip httpRuntime öğesini ekleyin. Ayrıca pages öğesine validateRequest = "false" özelliğini ekleyin.

Misal:

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

1
Benim için validateRequest = "false" gerekli değildi, sadece requestValidationMode = "2.0"
tom redfern

3
"Sayfalar" bölümü "system.web" bölümünde olmalıdır.
Carter Medlin

bir kez daha tehlikeli cevap.
MC9000

İkisine de ihtiyacım vardı. Teşekkürler
Jack

23

ValidateRequest'i devre dışı bırakmak istemiyorsanız, istisnayı önlemek için bir JavaScript işlevi uygulamanız gerekir. En iyi seçenek değil, ama işe yarıyor.

function AlphanumericValidation(evt)
{
    var charCode = (evt.charCode) ? evt.charCode : ((evt.keyCode) ? evt.keyCode :
        ((evt.which) ? evt.which : 0));

    // User type Enter key
    if (charCode == 13)
    {
        // Do something, set controls focus or do anything
        return false;
    }

    // User can not type non alphanumeric characters
    if ( (charCode <  48)                     ||
         (charCode > 122)                     ||
         ((charCode > 57) && (charCode < 65)) ||
         ((charCode > 90) && (charCode < 97))
       )
    {
        // Show a message or do something
        return false;
    }
}

Ardından, arkasındaki kodda, PageLoad olayında, özniteliği bir sonraki kodla kontrolünüze ekleyin:

Me.TextBox1.Attributes.Add("OnKeyPress", "return AlphanumericValidation(event);")

4
Bu, uygulamayı yine de yapılan POST isteklerine karşı savunmasız bırakacaktır. Normal bir kullanıcı,: veya tırnak işareti gibi karakterleri girmede sorun yaşayacaktır, ancak normal bir bilgisayar korsanı hatalı biçimlendirilmiş verileri sunucuya POST yapmakta sorun yaşamaz. Bu vahşiyi reddederdim.
Radu094

13
@ Radu094: Bu çözüm ValidateRequest = true değerini korumanıza izin veriyor, bu da bilgisayar korsanlarının hala duvara çarpacağı anlamına geliyor. ValidateRequest'i kapatmaktan daha az savunmasız kaldığınız için UP'a oy verin.
jbehren

21

Henüz kimse aşağıdakilerden bahsetmedi gibi görünüyor, ancak sorunu benim için düzeltiyor. Ve kimse evet demeden önce Visual Basic ... yuck.

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Example.aspx.vb" Inherits="Example.Example" **ValidateRequest="false"** %>

Herhangi bir dezavantajı olup olmadığını bilmiyorum, ama benim için bu inanılmaz çalıştı.


Web formları c # veya VB için çalışır
TheAlbear

19

Başka bir çözüm:

protected void Application_Start()
{
    ...
    RequestValidator.Current = new MyRequestValidator();
}

public class MyRequestValidator: RequestValidator
{
    protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
    {
        bool result = base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);

        if (!result)
        {
            // Write your validation here
            if (requestValidationSource == RequestValidationSource.Form ||
                requestValidationSource == RequestValidationSource.QueryString)

                return true; // Suppress error message
        }
        return result;
    }
}

Güzel! İstek Doğrulayıcı'nın değiştirilebileceğinin farkında değildi. Sadece sizin gibi "tamam" demek yerine, bu fikri "_NoValidation" ile biten alanları adlarıyla doğrulamayacak şekilde genişlettim. Aşağıdaki kod.
Walden Leverich

Walden Leverich, bunu yapmak için bkz. [AllowHtml] özelliği
Sel

Sel, evet bir MVC ortamında işe yarayacak. Ama bir webforms uygulamasında bunu yapacak bir modelim yok. :-)
Walden Leverich

15

Framework 4.0 kullanıyorsanız, web.config dosyasındaki giriş (<pages validateRequest = "false" />)

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

Framework 4.5 kullanıyorsanız, web.config dosyasındaki giriş (requestValidationMode = "2.0")

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

Sadece tek bir sayfa istiyorsanız, aspx dosyasında ilk satırı şu şekilde koymalısınız:

<%@ Page EnableEventValidation="false" %>

<% @ Sayfa gibi bir şeyiniz varsa, geri kalanını ekleyin => EnableEventValidation="false" %>

Bunu yapmamanızı tavsiye ederim.


13

ASP.NET'te, istisnayı yakalayabilir ve bu konuda kolay bir mesaj görüntülemek veya başka bir sayfaya yönlendirmek gibi bir şey yapabilirsiniz ... Ayrıca doğrulamayı kendiniz halledebilme olasılığı vardır ...

Kolay mesaj görüntüle:

protected override void OnError(EventArgs e)
{
    base.OnError(e);
    var ex = Server.GetLastError().GetBaseException();
    if (ex is System.Web.HttpRequestValidationException)
    {
        Response.Clear();
        Response.Write("Invalid characters."); //  Response.Write(HttpUtility.HtmlEncode(ex.Message));
        Response.StatusCode = 200;
        Response.End();
    }
}

13

Sanırım bunu bir modülde yapabilirsiniz; ama bu bazı soruları açık bırakır; girişi bir veritabanına kaydetmek isterseniz ne olur? Aniden kodlanmış verileri veritabanına kaydettiğiniz için, girdiden güveniyorsunuz ve bu muhtemelen kötü bir fikir. İdeal olarak, ham kodlanmamış verileri her seferinde veritabanında ve kodlamada depolarsınız.

Korumayı sayfa başına devre dışı bırakmak ve ardından her seferinde kodlamak daha iyi bir seçenektir.

Server.HtmlEncode kullanmak yerine , Microsoft ACE ekibinden daha yeni, daha eksiksiz Anti-XSS kitaplığına bakmalısınız .


12

Sebep olmak

ASP.NET varsayılan olarak, siteler arası komut dosyası (XSS) ve SQL enjeksiyonlarına yol açabilecek, güvenli olmayabilecek içerikler için tüm giriş denetimlerini doğrular . Böylece, yukarıdaki istisnayı atarak bu tür içeriğe izin vermemektedir. Varsayılan olarak, bu kontrolün her geri gönderide gerçekleşmesine izin verilmesi önerilir.

Çözüm

Birçok durumda Zengin Metin Kutuları veya Zengin Metin Düzenleyicileri aracılığıyla sayfanıza HTML içeriği göndermeniz gerekir. Bu durumda, @Pageyönergede ValidateRequest etiketini false olarak ayarlayarak bu özel durumu önleyebilirsiniz .

<%@ Page Language="C#" AutoEventWireup="true" ValidateRequest = "false" %>

Bu, ValidateRequest bayrağını false olarak ayarladığınız sayfa için isteklerin doğrulanmasını devre dışı bırakır. Bunu devre dışı bırakmak istiyorsanız, web uygulamanız boyunca kontrol edin; web.config <system.web> bölümünüzde false olarak ayarlamanız gerekir

<pages validateRequest ="false" />

.NET 4.0 veya üstü çerçeveler için, yukarıdakilerin çalışması için <system.web> bölümüne aşağıdaki satırı da eklemeniz gerekir.

<httpRuntime requestValidationMode = "2.0" />

Bu kadar. Umarım bu yukarıdaki sorundan kurtulmanıza yardımcı olur.

Referans: ASP.Net Hatası: Potansiyel olarak tehlikeli bir Request.Form değeri istemciden saptandı


10

.NET kodunu çözen (ve jQuery gerektirmeyen) verileri kodlamak için JavaScript kullanan bir çözüm buldum.

  • Metin kutusunu ASP yerine HTML öğesi (textarea gibi) yapın.
  • Gizli bir alan ekleyin.
  • Aşağıdaki JavaScript işlevini başlığınıza ekleyin.

    function boo () {targetText = document.getElementById ("HiddenField1"); sourceText = document.getElementById ("kullanıcı kutusu"); targetText.value = escape (sourceText.innerText); }

Metin alanınıza boo () öğesini çağıran bir değişim ekleyin:

<textarea id="userbox"  onchange="boo();"></textarea>

Son olarak, .NET'te

string val = Server.UrlDecode(HiddenField1.Value);

Bunun tek yönlü olduğunun farkındayım - iki yönlü gerekiyorsa yaratıcı olmanız gerekir, ancak web.config dosyasını düzenleyemiyorsanız bu bir çözüm sağlar

İşte bir örnek I (MC9000) ile geldi ve jQuery ile kullanın:

$(document).ready(function () {

    $("#txtHTML").change(function () {
        var currentText = $("#txtHTML").text();
        currentText = escape(currentText); // Escapes the HTML including quotations, etc
        $("#hidHTML").val(currentText); // Set the hidden field
    });

    // Intercept the postback
    $("#btnMyPostbackButton").click(function () {
        $("#txtHTML").val(""); // Clear the textarea before POSTing
                               // If you don't clear it, it will give you
                               // the error due to the HTML in the textarea.
        return true; // Post back
    });


});

Ve işaretleme:

<asp:HiddenField ID="hidHTML" runat="server" />
<textarea id="txtHTML"></textarea>
<asp:Button ID="btnMyPostbackButton" runat="server" Text="Post Form" />

Harika çalışıyor. Bir bilgisayar korsanı JavaScript'i atlayarak yayın göndermeye çalışırsa hatayı görürler. Tüm bu verileri bir veritabanına da kaydedebilir, daha sonra (sunucu tarafında) görüntüsünü kaldırabilir ve başka bir yerde görüntülemeden önce saldırıları ayrıştırıp kontrol edebilirsiniz.


Bu iyi bir çözüm. Kendiniz kontrol etmek ve tüm web sitesini veya sayfayı geçersiz kılmak için uygun bir manuel yol
Fandango68

Metin alanı için ASP.Net denetimi değil, HTML işaretlemesi kullandığınızdan emin olun (örn. Runat = "server"), sonra gizli olanlar için ASP.Net gizli denetimini kullanın. Bu, hiçbir şeyden ödün vermeden gördüğüm en iyi çözüm. Doğal olarak, verilerinizi sunucu tarafında XSS, SQL Enjeksiyonu için ayrıştırmak istiyorsunuz, ancak en azından HTML gönderebilirsiniz
MC9000

escape(...)uzun sürebilir. Benim durumumda, biçimlendirme tüm (2MB) bir XML dosyasıydı. "Neden sadece kullanmıyorsun <input type="file"...ve ... Sana katılıyorum :)
Kızıl Bezelye

10

Buradaki diğer çözümler güzel, ancak her bir Model mülküne, özellikle iyi boyutta bir sitede 100'den fazla modeliniz varsa, [AllowHtml] 'i uygulamak zorunda kalmak, arkadaki kraliyet ağrısından biraz.

Benim gibi, bu (IMHO oldukça anlamsız) özelliğini site genelinde kapatmak istiyorsanız, temel denetleyicinizdeki Execute () yöntemini geçersiz kılabilirsiniz (zaten bir temel denetleyiciniz yoksa, bir tane yapmanızı öneririm, ortak işlevsellik uygulamak için oldukça yararlı).

    protected override void Execute(RequestContext requestContext)
    {
        // Disable requestion validation (security) across the whole site
        ValidateRequest = false;
        base.Execute(requestContext);
    }

HTML girişini, kullanıcı girişinden gelen görünümlere pompalanan her şeyi kodladığınızdan emin olun (ASP.NET MVC 3'te Razor ile varsayılan davranışı zaten, bu nedenle bazı tuhaf nedenlerden dolayı Html.Raw () kullanmıyorsanız, bu özelliği gerektirmemelidir.


9

Ben de bu hatayı alıyordum.

Benim durumumda, bir kullanıcı áRol Adında (ASP.NET üyelik sağlayıcısıyla ilgili) aksanlı bir karakter girmiştir .

Rol adını Kullanıcıları bu role vermek için bir yönteme geçiriyorum ve $.ajaxgönderi isteği sefil bir şekilde başarısız oldu ...

Sorunu çözmek için bunu yaptım:

Onun yerine

data: { roleName: '@Model.RoleName', users: users }

Bunu yap

data: { roleName: '@Html.Raw(@Model.RoleName)', users: users }

@Html.Raw hile yaptı.

Rol adını HTML değeri olarak alıyordum roleName="Cadastro b&#225;s". HTML varlığı ile bu değer &#225;ASP.NET MVC tarafından engellendi. Şimdi roleNameparametre değerini olması gerektiği gibi alıyorum : roleName="Cadastro Básico"ve ASP.NET MVC motoru artık isteği engellemiyor.


9

Eğer gerçekten gibi özel karakterleri gerekiyorsa sayfa doğrulama devre dışı bırakın >, <vb Sonra kullanıcı girişi görüntülendiğinde, verileri HTML kodlu olduğundan emin olun.

Sayfa doğrulamasında bir güvenlik açığı vardır, bu nedenle atlanabilir. Ayrıca sayfa doğrulamasına yalnızca güvenilmemelidir.

Bkz. Http://web.archive.org/web/20080913071637/http://www.procheckup.com:80/PDFs/bypassing-dot-NET-ValidateRequest.pdf


Bağlantı koptu.
Peter Mortensen

7

Özel karakterleri değiştirmek için JavaScript'in escape (string) işlevini de kullanabilirsiniz . Sonra sunucu tarafı Sunucu kullanın. Urldecode (dize) geri dönmek için.

Bu şekilde giriş doğrulamayı kapatmak zorunda kalmazsınız ve diğer programcılar için dizenin HTML içeriğine sahip olabileceği daha açık olacaktır.


7

İstediğiniz karakterleri kontrol etmek için her bir geri göndermeden önce JavaScript kullandım, örneğin:

<asp:Button runat="server" ID="saveButton" Text="Save" CssClass="saveButton" OnClientClick="return checkFields()" />

function checkFields() {
    var tbs = new Array();
    tbs = document.getElementsByTagName("input");
    var isValid = true;
    for (i=0; i<tbs.length; i++) {
        if (tbs(i).type == 'text') {
            if (tbs(i).value.indexOf('<') != -1 || tbs(i).value.indexOf('>') != -1) {
                alert('<> symbols not allowed.');
                isValid = false;
            }
        }
    }
    return isValid;
}

Sayfamın çoğunlukla veri girişi olduğu ve geri gönderme yapan çok az öğe var, ancak en azından verileri korunuyor.


Küçük parantez yerine büyük parantez olmalıdır. Gibi `if (tbs [i] .Type == 'text') {` { `if (.Type == 'text' tbs (i))` yerine
Shilpa Soni

5

Şöyle bir şey kullanabilirsiniz:

var nvc = Request.Unvalidated().Form;

Daha sonra nvc["yourKey"]çalışmalı.


Teşekkürler, cevabım çok zamanımı kurtardı
habib

4

Bunlar yalnızca "<" ve ">" (ve çift tırnak işareti değil) karakterler olduğu ve bunları <input value = " this " /> gibi bağlamda kullandığınız sürece güvende olursunuz (<textarea için) > bu </textarea> tabi ki savunmasız kalabilirsiniz). Bu durumunuzu basitleştirebilir, ancak daha fazla şey için diğer yayınlanan çözümlerden birini kullanın.


4

Sadece kullanıcılarınıza <ve> kullanılmayacağını söylemek istiyorsanız, AMA tüm formun önceden işlenmesini / geri gönderilmesini (ve tüm girdileri kaybetmesini) istemezsiniz. (ve belki tehlikeli olabilecek diğer) karakterleri taramak için alanın etrafındaki doğrulayıcı?


post "validator" lütfen dedi
mxmissile

4

Önerilerin hiçbiri benim için işe yaramadı. Bu özelliği tüm web sitesi için yine de kapatmak istemedim çünkü% 99 zaman kullanıcılarımın web formlarına HTML yerleştirmesini istemiyorum. Bu özel uygulamayı kullanan tek kişi olduğum için kendi çalışma yöntemimi oluşturdum. Giriş kodunu HTML koduna dönüştürüyorum ve veritabanına ekliyorum.

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.