संभावित रूप से खतरनाक Request.Form मान क्लाइंट से पाया गया था


1471

जब भी कोई उपयोगकर्ता मेरे वेब एप्लिकेशन में किसी पृष्ठ <या >किसी पृष्ठ पर कुछ पोस्ट करता है, तो मुझे यह अपवाद मिलता है।

मैं एक अपवाद को फेंकने या एक संपूर्ण वेब एप्लिकेशन को क्रैश करने की स्मार्टनेस के बारे में चर्चा में नहीं जाना चाहता क्योंकि किसी व्यक्ति ने एक टेक्स्ट बॉक्स में एक चरित्र दर्ज किया था, लेकिन मैं इसे संभालने के लिए एक सुरुचिपूर्ण तरीके की तलाश कर रहा हूं।

अपवाद फँसाना और दिखाना

एक त्रुटि हुई है कृपया वापस जाएं और अपने पूरे फॉर्म को फिर से टाइप करें, लेकिन इस बार कृपया उपयोग न करें <

मेरे लिए पर्याप्त पेशेवर नहीं लगता है।

पोस्ट सत्यापन ( validateRequest="false") को अक्षम करने से निश्चित रूप से इस त्रुटि से बचा जा सकेगा, लेकिन यह पेज को कई हमलों के लिए असुरक्षित बना देगा।

आदर्श रूप से: जब पोस्ट बैक में HTML प्रतिबंधित वर्ण होते हैं, तो फॉर्म संग्रह में पोस्ट किया गया मान स्वचालित रूप से HTML एन्कोडेड होगा। तो .Textमेरे टेक्स्ट-बॉक्स की संपत्ति होगीsomething & lt; html & gt;

क्या कोई तरीका है जो मैं एक हैंडलर से कर सकता हूं?


68
ध्यान दें कि यदि आपके HTML इनपुट नाम (& amp;) या इकाई संख्या (& # 39) आपके इनपुट में हैं, तो आप यह त्रुटि प्राप्त कर सकते हैं।
ड्रू नोक

18
खैर, चूंकि यह मेरा सवाल है मुझे लगता है कि मैं यह परिभाषित कर सकता हूं कि वास्तव में बिंदु क्या है: एक संपूर्ण आवेदन प्रक्रिया को क्रैश करना और एक सामान्य त्रुटि संदेश वापस करना क्योंकि किसी ने टाइप किया 'a' ओवरकिल है। खासकर जब से आप जानते हैं कि ज्यादातर लोग इससे छुटकारा पाने के लिए सिर्फ 'मान्यकृत = गलत' जानते हैं, इस तरह भेद्यता को फिर से खोलना
रादु094

7
@DrewNoakes: निकाय नाम (& amp;) मेरे परीक्षणों के अनुसार एक समस्या नहीं लगती है (परीक्षण में .net 4.0), हालांकि इकाई संख्या (& # 39;) विफल सत्यापन (जैसा आपने कहा)। यदि आप System.Web.CrossSiteScriptingValidation .sDangerousString विधि .Net परावर्तक का उपयोग करते हैं, तो आप देखेंगे कि कोड विशेष रूप से html टैग (<के साथ शुरू) और इकाई संख्या (& # के साथ शुरू)
Gyum Fox

5
डिफ़ॉल्ट MVC प्रोजेक्ट का उपयोग करके VS2014 में एक नई साइट बनाएं और इसे चलाएं। रजिस्टर लिंक पर क्लिक करें, कोई भी ईमेल जोड़ें, और "<P455-0r [!" का उपयोग करें पासवर्ड के रूप में। बॉक्स के बाहर एक ही त्रुटि, कुछ भी दुर्भावनापूर्ण करने की कोशिश नहीं कर रहा है, पासवर्ड फ़ील्ड प्रदर्शित नहीं किया जाएगा, इसलिए यह XSS हमला नहीं होगा, लेकिन इसे ठीक करने का एकमात्र तरीका ValidateInput (झूठा) के साथ सत्यापन को पूरी तरह से हटा देना है ? AllowHtml सुझाव इस स्थिति में काम नहीं करता है, फिर भी उसी त्रुटि के साथ उड़ा दिया गया है। संभावित खतरनाक Request.Form मान क्लाइंट (पासवर्ड = "<P455-0r [!") से पाया गया था।
स्टीफनबायर

TL, DR <httpRuntime requestValidationMode="2.0" />web.config में

जवाबों:


1080

मुझे लगता है कि आप सभी पोस्ट किए गए डेटा को एनकोड करने की कोशिश करके इसे गलत कोण से हमला कर रहे हैं।

ध्यान दें कि एक " <" अन्य बाहरी स्रोतों से भी आ सकता है, जैसे डेटाबेस फ़ील्ड, कॉन्फ़िगरेशन, फ़ाइल, फ़ीड और इसी तरह।

इसके अलावा, " <" स्वाभाविक रूप से खतरनाक नहीं है। यह केवल एक विशिष्ट संदर्भ में खतरनाक है: जब एचटीएमएल आउटपुट (XSS के कारण) को एन्कोड नहीं किया गया है, तो स्ट्रिंग्स लिखना।

अन्य संदर्भों में, अलग-अलग उप-स्ट्रिंग खतरनाक हैं, उदाहरण के लिए, यदि आप उपयोगकर्ता द्वारा प्रदान किए गए URL को लिंक में लिखते हैं, तो उप-स्ट्रिंगjavascript: " खतरनाक हो सकती है। SQL क्वेश्चन में स्ट्रिंग्स को इंटरपोल करते समय दूसरी ओर सिंगल कोट कैरेक्टर खतरनाक होता है, लेकिन अगर यह किसी फॉर्म से सबमिट किए गए नाम का एक हिस्सा है या डेटाबेस फील्ड से पढ़ा जाता है।

लब्बोलुआब यह है: आप खतरनाक पात्रों के लिए यादृच्छिक इनपुट को फ़िल्टर नहीं कर सकते, क्योंकि कोई भी चरित्र सही परिस्थितियों में खतरनाक हो सकता है। आपको उस बिंदु पर सांकेतिक शब्दों में बदलना चाहिए जहां कुछ विशिष्ट चरित्र खतरनाक हो सकते हैं क्योंकि वे एक अलग उप-भाषा में पार करते हैं जहां उनका विशेष अर्थ है। जब आप HTML को एक स्ट्रिंग लिखते हैं, तो आपको उन अक्षरों को एनकोड करना चाहिए जिनका HTML में विशेष अर्थ है। Server.HtmlEncode का उपयोग करना। यदि आप एक गतिशील एसक्यूएल स्टेटमेंट के लिए एक स्ट्रिंग पास करते हैं, तो आपको अलग-अलग वर्णों को एन्कोड करना चाहिए (या बेहतर है, तैयार किए गए स्टेटमेंट या इस तरह का उपयोग करके फ्रेमवर्क को आपके लिए करने दें)।

जब आप हर जगह आप HTML करने के लिए तार पारित सुनिश्चित करें कि आप एचटीएमएल एन्कोड कर रहे हैं, तो सेट validateRequest="false"में <%@ Page ... %>में निर्देश अपने.aspx फ़ाइल (फ़ाइलें)।

.NET 4 में आपको थोड़ा और करने की आवश्यकता हो सकती है। कभी-कभी यह <httpRuntime requestValidationMode="2.0" />web.config ( संदर्भ ) में भी जोड़ना आवश्यक है ।


74
देर से आने वालों के लिए: validateRequest = "false" पृष्ठ निर्देश में जाता है (आपकी .aspx फ़ाइल की पहली पंक्ति)
MGOwen

56
युक्ति: <httpRuntime requestValidationMode="2.0" />अपनी साइट के बाकी हिस्सों से सत्यापन द्वारा प्रदान की गई उपयोगी सुरक्षा को मारने से बचने के लिए एक स्थान टैग में रखें ।
ब्रायन

297
एमवीसी 3 में, यह [AllowHtml]मॉडल संपत्ति पर है।
जेरेमी होलोवैकस

2
MVC 3 के लिए इसे विश्व स्तर पर अक्षम करने के लिए भी आपको आवश्यकता GlobalFilters.Filters.Add(new ValidateInputAttribute(false));है Application_Start()
एलेक्स

15
@MGOwen के माध्यम से <pages validateRequest="false" />आप web.config में पेज निर्देश भी जोड़ सकते हैं <system.web />। ऐसा करने से संपत्ति सभी पृष्ठों पर लागू होगी।
ऑलिव-क्लेयर

504

यदि आप ASP.NET MVC का उपयोग कर रहे हैं तो इस त्रुटि का एक अलग समाधान है:

सी # नमूना:

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

दृश्य मूल नमूना:

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

समस्या तब हो सकती है जब इसे पूरे एप्लिकेशन के एक पृष्ठ पर जरूरत पड़े

3
आप वर्ग स्तर पर [ValidateInput (false)] विशेषता भी जोड़ सकते हैं। यदि आप इसे अपने आधार नियंत्रक वर्ग में जोड़ते हैं, तो यह सभी नियंत्रक विधि क्रियाओं पर लागू होगा।
शान प्लॉर्ड

@Zack समाधान के लिए धन्यवाद। दूसरी तरफ मैं सोच रहा हूं कि क्या इससे [AllowHtml]बेहतर है ValidateInput(false), क्योंकि [AllowHtml]एक बार एक संपत्ति यानी संपादक क्षेत्र के लिए परिभाषित किया गया है और जब भी इसका उपयोग किया जाता है, तो इसे कई कार्यों के लिए उपयोग करने की आवश्यकता नहीं होती है। आपकी क्या सलाह है?
जैक

@Zack पीटरसन क्या इसका उपयोग करना सुरक्षित है? कोई सुरक्षा मुद्दा नहीं?
श्रेय पाव

416

ASP.NET MVC (संस्करण 3 में शुरू) से, आप AllowHtmlअपने मॉडल पर एक संपत्ति में विशेषता जोड़ सकते हैं ।

यह संपत्ति के लिए अनुरोध सत्यापन को लंघन द्वारा मॉडल बाइंडिंग के दौरान HTML मार्कअप को शामिल करने के लिए एक अनुरोध की अनुमति देता है।

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

12
नियंत्रक की तुलना में यह बेहतर घोषित करने के लिए बेहतर है!
औरिह

29
एकमात्र सही उत्तर! नियंत्रक कार्रवाई पर सत्यापन को अक्षम करना हैक्य है। और आवेदन स्तर पर सत्यापन को अक्षम करने के लिए, देवों को फांसी दी जानी चाहिए!
ट्रेलमैक्स

क्या यह MVC 4 में गायब हो गया?
ग्रेनडाकोडर

1
बीच क्या अंतर है ValidateInput(false)और AllowHtml? एक के ऊपर एक फायदा क्या है? मैं AllowHtmlइसके बजाय कब उपयोग करना चाहूंगा ValidateInput(false)? जब मैं का उपयोग करना चाहते हैं ValidateInput(false)के ऊपर AllowHtml? मैं दोनों का उपयोग कब करना चाहूंगा? क्या यह दोनों का उपयोग करने के लिए समझ में आता है?
इयान बॉयड

3
ValidateInput विधि पर है, AllowHtml मॉडल की संपत्ति पर है - तो आप केवल उसी को अनुमति दें जिसकी आपको html की उम्मीद है - सभी नहीं
एंथनी जॉन्सटन

213

यदि आप .NET 4.0 पर हैं, तो सुनिश्चित करें कि आप इसे अपने web.config फ़ाइल में <system.web>टैग के अंदर जोड़ते हैं :

<httpRuntime requestValidationMode="2.0" />

.NET 2.0 में, aspxअनुरोधों पर लागू होने वाले सत्यापन का अनुरोध करें। .NET 4.0 में यह सभी अनुरोधों को शामिल करने के लिए विस्तारित किया गया था । जब आप निर्दिष्ट करके केवल XSS सत्यापन करने के लिए वापस लौट सकते हैं .aspx:

requestValidationMode="2.0"

आप निर्दिष्ट करके अनुरोध को पूरी तरह से अक्षम कर सकते हैं :

validateRequest="false"

30
<system.web>टैग के अंदर ।
होसम एली

8
मैंने इसे web.config में डाल दिया है, लेकिन फिर भी "एक संभावित खतरनाक Request.Form मूल्य" त्रुटि के लिए
Filip

20
ऐसा लगता है कि <httpRuntime requestValidationMode = "2.0" /> केवल तभी काम करता है जब मशीन पर 2.0 फ्रेमवर्क स्थापित किया गया हो। क्या होगा अगर 2.0 फ्रेमवर्क स्थापित नहीं है, लेकिन केवल 4.0 फ्रेमवर्क स्थापित है?
शमूएल

यह पूरी तरह से मेरे लिए काम किया। अन्य उत्तरों में कोई भी स्टेप डॉक्यूमेंट आवश्यक नहीं था (जिसमें वैद्युमप्रमाण = "असत्य" भी शामिल है)!
टॉम 10

112

ASP.NET 4.0 के लिए, आप सभी को एक <location>तत्व में रखकर पूरी साइट के बजाय विशिष्ट पृष्ठों के लिए इनपुट के रूप में मार्कअप की अनुमति दे सकते हैं । यह सुनिश्चित करेगा कि आपके अन्य सभी पृष्ठ सुरक्षित हैं। आपको ValidateRequest="false"अपने .aspx पृष्ठ में डालने की आवश्यकता नहीं है ।

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

इसे अपने web.config के अंदर नियंत्रित करना सुरक्षित है, क्योंकि आप साइट स्तर पर देख सकते हैं कि कौन से पृष्ठ मार्कअप को इनपुट के रूप में अनुमति देते हैं।

आपको अभी भी उन पृष्ठों पर प्रोग्रामेटिक रूप से मान्य सत्यापन की आवश्यकता है जहां अनुरोध सत्यापन अक्षम है।


: 4 यहाँ | requestValidationMode = 2 पर अधिक जानकारी msdn.microsoft.com/en-us/library/...
GlennG

अफसोस की बात है कि यह ASP.net 2.0 के साथ काम नहीं करेगा। HttpRuntime लाइन निकालें और यह काम करेगा।
फैंडैंगो 68

मैंने एक चेतावनी जोड़ी कि लोगों को मैन्युअल रूप से इनपुट को मान्य करने की याद दिलाता है जब सत्यापन अक्षम होता है।
कार्टर मेडलिन

72

पिछले उत्तर बहुत अच्छे हैं, लेकिन किसी ने भी यह नहीं बताया कि HTML / जावास्क्रिप्ट इंजेक्शन के लिए किसी एकल क्षेत्र को कैसे मान्य किया जाए। मैं पिछले संस्करणों के बारे में नहीं जानता, लेकिन MVC3 बीटा में आप ऐसा कर सकते हैं:

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

यह अभी भी एक को छोड़कर सभी क्षेत्रों को मान्य करता है। इसके बारे में अच्छी बात यह है कि आपकी सत्यापन विशेषताएँ अभी भी फ़ील्ड को मान्य करती हैं, लेकिन आपको "संभावित रूप से खतरनाक अनुरोध नहीं मिला है। ग्राहक से अपवाद का पता लगाया गया था" अपवाद।

मैंने इसका उपयोग एक नियमित अभिव्यक्ति को मान्य करने के लिए किया है। मैंने अपना स्वयं का मान्यकरण बनाया है, यह देखने के लिए कि नियमित अभिव्यक्ति वैध है या नहीं। जैसा कि नियमित अभिव्यक्तियों में कुछ ऐसा हो सकता है जो एक स्क्रिप्ट की तरह दिखता है जिसे मैंने उपरोक्त कोड लागू किया है - नियमित अभिव्यक्ति की अभी भी जाँच की जा रही है कि क्या यह वैध है या नहीं, लेकिन इसमें स्क्रिप्ट या HTML नहीं है।


10
अफसोस की बात यह है कि MVC 3 RTW से बहिष्कृत सुविधा को हटा दिया गया था :(
मैट ग्रीर

2
ना ही इसे MVC 4 में शामिल किया गया
wilsjd

9
समान अंतिम परिणाम प्राप्त करने के लिए क्रिया के [AllowHtml]बजाय मॉडल के गुणों का उपयोग करें [ValidateInput]
मर्चिफ़

2
@Christof ध्यान दें कि मेरा उत्तर 5 साल पुराना है। मैं वास्तव में लंबे समय में इस समस्या को लेकर नहीं आया हूं, इसलिए इससे निपटने के कई बेहतर तरीके हो सकते हैं। इस दो विकल्पों के बारे में मुझे लगता है कि यह आपकी स्थिति पर निर्भर करता है। हो सकता है कि आप उस मॉडल को एक से अधिक क्रियाओं में उजागर करते हैं और कुछ स्थानों पर HTML की अनुमति है या नहीं। ऐसे मामले [AllowHtml]में एक विकल्प नहीं है। मैं इस लेख की जाँच करने की सलाह देता हूँ: weblogs.asp.net/imranbaloch/… , लेकिन यह भी कुछ पुराना है और पुराना हो सकता है।
ग्लिगनैन

1
मान्यकरण से विशेष विधि मापदंडों को बाहर करने का अभी भी एक तरीका है, मेरे जवाब को यहां देखें: stackoverflow.com/a/50796666/56621
एलेक्स

51

ASP.NET MVC में आपको web.config में requestValidationMode = "2.0" और validateRequest = "false" सेट करने की आवश्यकता है, और अपने नियंत्रक कार्रवाई के लिए एक ValidateInput विशेषता लागू करें:

<httpRuntime requestValidationMode="2.0"/>

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

तथा

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

2
मेरे लिए, validateRequest="false"आवश्यक हो, केवल नहीं थाrequestValidationMode="2.0"
टॉम Redfern

requestValidationMode = "2.0" अभी भी HTMLencoded डेटा के साथ त्रुटि उत्पन्न करता है। Base64 को छोड़कर कोई भी समाधान सब कुछ एनकोड नहीं करता है, तो इसे साथ भेजें।
MC9000

48

आप HTML टेक्स्ट बॉक्स सामग्री को एन्कोड कर सकते हैं , लेकिन दुर्भाग्य से ऐसा होने से अपवाद नहीं होगा। मेरे अनुभव में कोई रास्ता नहीं है, और आपको पृष्ठ सत्यापन को अक्षम करना होगा। ऐसा करने से आप कह रहे हैं: "मैं सावधान रहूँगा, मैं वादा करता हूँ।"


43

MVC के लिए, इनपुट सत्यापन को जोड़कर अनदेखा करें

[ValidateInput (गलत)]

नियंत्रक में प्रत्येक क्रिया के ऊपर।


यह उस मामले में काम नहीं करता है जो इसे कॉन्फ़िगर किए गए मार्ग के माध्यम से नियंत्रक विधि को मिलता है।
पांडावुड

दरअसल, तकनीकी स्पष्टीकरण, यह केवल तभी काम करता है जब आपत्तिजनक चरित्र "क्वेरी स्ट्रिंग" में है ... यदि यह अनुरोध पथ में है, तो सत्यापन विशेषता काम नहीं करती है
PANDWood

42

आप उस त्रुटि को Global.asax में पकड़ सकते हैं। मैं अभी भी मान्य करना चाहता हूं, लेकिन एक उचित संदेश दिखाता हूं। नीचे सूचीबद्ध ब्लॉग पर, इस तरह का एक नमूना उपलब्ध था।

    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();
        }
    }

दूसरे पृष्ठ पर पुनर्निर्देशन भी अपवाद के लिए एक उचित प्रतिक्रिया की तरह लगता है।

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


40

इस प्रश्न का उत्तर सरल है:

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

यह विशेष अनुरोध के लिए सत्यापन को अक्षम कर देगा।


1
केवल ASP.NET 4.5 के लिए लागू है (और, संभवतः, इसके बाद जो भी आएगा।) प्री 4.5 इसका समर्थन नहीं करता है।
बेस्का

3
काश मैं इस तरह से टकरा सकता। मैं .NET 4.5 का उपयोग कर रहा हूं और यह बिल्कुल वैसा ही है जैसा मुझे MVC का उपयोग नहीं करने के बाद से चाहिए और मैं web.config को नहीं बदल सकता।
क्रिस जिलुम

1
हाँ, लेकिन क्या होगा यदि आप .Net 2 का उपयोग कर रहे हैं? हम में से कुछ के पास कोई विकल्प नहीं है
Fandango68

यह POST या GET पैरामीटर प्राप्त करता है?
अधिकतम 4

क्या आप कह रहे हैं कि यह एक अपवाद को रोकता है जो पहले ही फेंक दिया गया था? या .net 4.5 अपवाद और सत्यापन में देरी करता है जब तक कि डेटा वास्तव में से नहीं पढ़ा जाता है Request?
ebyrob

34

कृपया ध्यान रखें कि कुछ .NET नियंत्रण स्वचालित रूप से HTML आउटपुट को एनकोड करेंगे। उदाहरण के लिए, टेक्स्ट बॉक्स नियंत्रण पर .Text गुण सेट करना स्वचालित रूप से इसे एन्कोड करेगा। इसका मतलब है कि विशेष रूप <से &lt;, >में &gt;और &में परिवर्तित करना &amp;। तो ऐसा करने से सावधान रहें ...

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

हालाँकि, हाइपरलिंक, लिटरल और लेबल के लिए .Text संपत्ति HTML चीजों को एन्कोड नहीं करेगी, इसलिए सर्वर को लपेटकर। एचटीएमएलनकोड (); इन गुणों के बारे में कुछ भी निर्धारित किया जाना चाहिए, यदि आप इसे रोकना चाहते हैं<script> window.location = "http://www.google.com"; </script> अपने पृष्ठ में आउटपुट होने से और बाद में निष्पादित होने से ।

यह देखने के लिए थोड़ा प्रयोग करें कि क्या एनकोड हो जाता है और क्या नहीं।


29

Web.config फ़ाइल में, टैग के भीतर, httpRuntime तत्व को विशेषता requestValidationMode = "2.0" के साथ डालें। पृष्ठ तत्व में validateRequest = "false" विशेषता भी जोड़ें।

उदाहरण:

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

1
मेरे लिए, validateRequest = "मिथ्या" आवश्यक नहीं था, केवल requestValidationMode = "2.0"
टॉम 10

3
"पेज" अनुभाग "system.web" अनुभाग के भीतर होना चाहिए।
कार्टर मेडलिन

खतरनाक उत्तर, एक बार फिर।
MC9000

मुझे दोनों की जरूरत थी। धन्यवाद
जैक

23

यदि आप ValidateRequest को अक्षम नहीं करना चाहते हैं, तो अपवाद से बचने के लिए आपको जावास्क्रिप्ट फ़ंक्शन लागू करना होगा। यह सबसे अच्छा विकल्प नहीं है, लेकिन यह काम करता है।

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;
    }
}

फिर PageLoad घटना के पीछे कोड में, अगले कोड के साथ अपने नियंत्रण में विशेषता जोड़ें:

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

4
यह अभी भी किए गए POST अनुरोधों से ऐप को असुरक्षित छोड़ देगा। एक नियमित उपयोगकर्ता को पात्रों को दर्ज करने में समस्याएं होंगी, जैसे: या उद्धरण, लेकिन एक नियमित हैकर को सर्वर पर विकृत डेटा को पोस्ट करने में कोई समस्या नहीं होगी। मैं इस waaay नीचे vode करेंगे।
रादु ०

13
@ Radu094: यह समाधान आपको ValidateRequest = true रखने की अनुमति देता है, जिसका अर्थ हैकर्स अभी भी उस दीवार को मारेंगे। वोट दें, क्योंकि यह आपको ValidateRequest को बंद करने की तुलना में कम संवेदनशील बनाता है।
जाबह्रेन

21

ऐसा लगता है कि किसी ने अभी तक नीचे उल्लेख नहीं किया है, लेकिन यह मेरे लिए समस्या को ठीक करता है। और इससे पहले कि कोई कहे कि हाँ यह विज़ुअल बेसिक है ... हाँ।

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

मुझे नहीं पता कि कोई डाउनसाइड्स हैं या नहीं, लेकिन मेरे लिए यह आश्चर्यजनक है।


वेब रूपों के लिए काम करता है c # या VB
TheAlbear

19

एक और उपाय है:

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;
    }
}

अच्छा! अनुरोध सत्यापनकर्ता को बदलने की क्षमता के बारे में पता नहीं था। आपके जैसे "ठीक" कहने के बजाय मैंने यह विचार उन क्षेत्रों को मान्य नहीं करने के लिए बढ़ाया, जो "_NoValidation" नाम के रूप में समाप्त होते हैं। नीचे कोड।
वाल्डेन लीवरिच

Walden Leverich, यह देखने के लिए [AllowHtml] एट्रिब्युर
Sel

सेल, एमवीसी वातावरण में हाँ जो काम करेगा। लेकिन एक webforms आवेदन में मैं ऐसा करने के लिए एक मॉडल नहीं है। :-)
वाल्डेन लीवरिच

15

यदि आप फ्रेमवर्क 4.0 का उपयोग कर रहे हैं, तो web.config में प्रविष्टि (<पृष्ठ validateRequest = "false" />)

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

यदि आप फ्रेमवर्क 4.5 का उपयोग कर रहे हैं तो web.config में प्रवेश (requestValidationMode = "2.0")

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

यदि आप केवल एकल पृष्ठ के लिए चाहते हैं, तो आप aspx फ़ाइल में आपको पहली पंक्ति इस प्रकार रखनी चाहिए:

<%@ Page EnableEventValidation="false" %>

अगर आपके पास पहले से <% @ पेज जैसा कुछ है तो बस बाकी => जोड़ें EnableEventValidation="false" %> जोड़ें

मैं इसे नहीं करने की सलाह देता हूं।


13

ASP.NET में, आप अपवाद को पकड़ सकते हैं और इसके बारे में कुछ कर सकते हैं, जैसे कि मैत्रीपूर्ण संदेश प्रदर्शित करना या किसी अन्य पृष्ठ पर पुनर्निर्देशित करना ... इसके अलावा एक संभावना है कि आप स्वयं द्वारा सत्यापन को संभाल सकते हैं ...

मैत्रीपूर्ण संदेश प्रदर्शित करें:

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

मुझे लगता है कि आप इसे एक मॉड्यूल में कर सकते हैं; लेकिन जो कुछ प्रश्न खोलते हैं; यदि आप किसी डेटाबेस में इनपुट सहेजना चाहते हैं तो क्या होगा? अचानक क्योंकि आप एन्कोडेड डेटा को उस डेटाबेस में सहेज रहे हैं, जिस पर आपको भरोसा है कि इससे इनपुट मिलता है, जो शायद एक बुरा विचार है। आदर्श रूप से आप डेटाबेस में कच्चे अनएन्कोडेड डेटा और हर बार एनकोड करते हैं।

प्रति पृष्ठ स्तर पर सुरक्षा को अक्षम करना और फिर हर बार एन्कोडिंग बेहतर विकल्प है।

Server.HtmlEncode का उपयोग करने के बजाय आपको Microsoft ACE टीम से नए, अधिक पूर्ण एंटी-XSS लाइब्रेरी को देखना चाहिए ।


12

कारण

ASP.NET डिफ़ॉल्ट रूप से संभावित असुरक्षित सामग्रियों के लिए सभी इनपुट नियंत्रणों को मान्य करता है जिससे क्रॉस-साइट स्क्रिप्टिंग (XSS) और SQL इंजेक्शन हो सकते हैं । इस प्रकार यह उपरोक्त अपवाद को फेंककर ऐसी सामग्री को अस्वीकार कर देता है। डिफ़ॉल्ट रूप से यह प्रत्येक चेकबैक पर इस चेक को होने देने के लिए अनुशंसित है।

समाधान

कई अवसरों पर आपको रिच टेक्स्टबॉक्स या रिच टेक्स्ट एडिटर्स के माध्यम से अपने पृष्ठ पर HTML सामग्री जमा करने की आवश्यकता होती है। उस स्थिति में आप ValidateRequest टैग @Pageको झूठे निर्देश में सेट करके इस अपवाद से बच सकते हैं ।

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

यह उस पृष्ठ के लिए अनुरोधों के सत्यापन को अक्षम कर देगा, जिस पर आपने ValidateRequest ध्वज सेट किया है। यदि आप इसे अक्षम करना चाहते हैं, तो अपने संपूर्ण वेब एप्लिकेशन की जांच करें; आपको इसे अपने web.config <system.web> अनुभाग में झूठे पर सेट करना होगा

<pages validateRequest ="false" />

.NET 4.0 या उच्चतर फ्रेमवर्क के लिए आपको उपरोक्त कार्य करने के लिए <system.web> अनुभाग में निम्न पंक्ति भी जोड़नी होगी।

<httpRuntime requestValidationMode = "2.0" />

बस। मुझे उम्मीद है कि यह उपरोक्त मुद्दे से छुटकारा पाने में आपकी मदद करता है।

संदर्भ द्वारा: ASP.Net त्रुटि: संभावित रूप से खतरनाक Request.Form मान क्लाइंट से पाया गया था


10

मुझे एक समाधान मिला, जो डेटा को एन्कोड करने के लिए जावास्क्रिप्ट का उपयोग करता है, जो .NET में डिकोड किया गया है (और jQuery की आवश्यकता नहीं है)।

  • टेक्स्ट बॉक्स को ASP के बजाय HTML एलिमेंट (textarea की तरह) बनाएं।
  • एक छिपा हुआ क्षेत्र जोड़ें।
  • अपने शीर्ष लेख में निम्न जावास्क्रिप्ट फंक्शन जोड़ें।

    function boo () {targetText = document.getElementById ("हिडनफ़िल्ड 1"); sourceText = document.getElementById ("userbox"); targetText.value = भागने (sourceText.innerText); }

अपने टेक्स्टारिया में, एक ऑनकॉन्ग शामिल करें जो बोओ () कहता है:

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

अंत में, .NET में, उपयोग करें

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

मुझे पता है कि यह एक तरफ़ा है - अगर आपको दो तरफ़ा ज़रूरत है तो आपको रचनात्मक होना पड़ेगा, लेकिन यदि आप web को संपादित नहीं कर सकते हैं तो यह एक समाधान प्रदान करता है।

यहाँ एक उदाहरण I (MC9000) आया और jQuery के माध्यम से उपयोग किया गया:

$(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
    });


});

और मार्कअप:

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

यह बहुत अच्छा काम करता है। यदि कोई हैकर जावास्क्रिप्ट को दरकिनार करके पोस्ट करने की कोशिश करता है, तो वे केवल त्रुटि देखेंगे। आप एक डेटाबेस में इनकोड किए गए सभी डेटा को भी सहेज सकते हैं, फिर इसे (सर्वर की तरफ) अनसेस्केप करें, और कहीं और प्रदर्शित करने से पहले पार्स और हमलों की जांच करें।


यह एक अच्छा उपाय है। यह स्वयं को नियंत्रित करने और संपूर्ण वेबसाइट या पृष्ठ को अमान्य न करने का एक उचित मैनुअल तरीका है
Fandango68

Textarea के लिए एक HTML मार्कअप का उपयोग न करें, ASP.Net नियंत्रण (यानी कोई रनैट = "सर्वर") का उपयोग न करें, फिर छिपे हुए के लिए ASP.Net छिपे नियंत्रण का उपयोग करें। यह सबसे अच्छा समाधान है जिसे मैंने कुछ भी समझौता करते हुए देखा है। स्वाभाविक रूप से, आप सर्वर पर XSS, SQL इंजेक्शन के लिए अपना डेटा पार्स करना चाहते हैं, लेकिन कम से कम आप HTML
MC9000

escape(...)एक लंबा समय लग सकता है। मेरे मामले में, मार्कअप एक संपूर्ण (2MB) XML फ़ाइल थी। आप पूछ सकते हैं, "आप सिर्फ उपयोग क्यों नहीं करते हैं <input type="file"...और ... मैं आपसे सहमत हूं :)
लाल मटर

10

यहाँ अन्य समाधान अच्छे हैं, हालाँकि हर एक मॉडल प्रॉपर्टी में [AllowHtml] लागू करने के लिए इसके पीछे एक शाही दर्द का एक सा है, खासकर यदि आपके पास एक सभ्य आकार की साइट पर 100 से अधिक मॉडल हैं।

यदि मेरी तरह, आप इसे (IMHO सुंदर व्यर्थ) सुविधा को बंद करना चाहते हैं, तो आप अपने बेस कंट्रोलर में Execute () विधि को ओवरराइड कर सकते हैं (यदि आपके पास पहले से कोई आधार नियंत्रक नहीं है जो मैं आपको एक बनाने का सुझाव देता हूं, तो वे हो सकते हैं आम कार्यक्षमता को लागू करने के लिए बहुत उपयोगी)।

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

बस सुनिश्चित करें कि आप HTML सब कुछ हैं जो उपयोगकर्ता इनपुट से आए विचारों के लिए पंप किए गए हैं (यह वैसे भी ASP.NET MVC 3 में रेजर के साथ डिफ़ॉल्ट व्यवहार है, इसलिए जब तक कि कुछ विचित्र कारण के लिए आप Html.Raw का उपयोग नहीं कर रहे हैं) इस सुविधा की आवश्यकता नहीं होनी चाहिए।


9

मुझे यह त्रुटि भी मिल रही थी।

मेरे मामले में, एक उपयोगकर्ता ने áरोल नाम (ASP.NET सदस्यता प्रदाता के बारे में) में एक उच्चारण चरित्र दर्ज किया ।

मैं उपयोगकर्ताओं को उस भूमिका को देने के लिए एक भूमिका नाम देता हूं और $.ajaxपोस्ट अनुरोध बुरी तरह से विफल हो रहा था ...

मैंने इस समस्या को हल करने के लिए ऐसा किया:

के बजाय

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

यह करो

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

@Html.Raw चाल चली।

मुझे HTML मान के रूप में भूमिका नाम मिल रहा था roleName="Cadastro b&#225;s"। HTML इकाई के साथ यह मान &#225;ASP.NET MVC द्वारा अवरुद्ध किया जा रहा था। अब मुझे roleNameपैरामीटर मान मिलता है जिस तरह से यह होना चाहिए: roleName="Cadastro Básico"और ASP.NET MVC इंजन अब अनुरोध को ब्लॉक नहीं करेगा।


9

पेज सत्यापन अक्षम यदि आप वास्तव में की तरह, विशेष वर्ण की जरूरत है >,, <, आदि तो सुनिश्चित जब उपयोगकर्ता इनपुट प्रदर्शित किया जाता है, डेटा HTML एन्कोड है।

पृष्ठ सत्यापन के साथ सुरक्षा भेद्यता है, इसलिए इसे बायपास किया जा सकता है। साथ ही पृष्ठ सत्यापन को पूरी तरह से निर्भर नहीं होना चाहिए।

देखें: http://web.archive.org/web/20080913071637/http://www.procheckup.com:80/PDFs/bypassing-dot-NET-ValidateRequest.pdf


लिंक टूट गया है।
पीटर मोर्टेंसन

7

आप विशेष वर्णों को बदलने के लिए जावास्क्रिप्ट एस्केप (स्ट्रिंग) फ़ंक्शन का भी उपयोग कर सकते हैं । फिर सर्वर साइड सर्वर का उपयोग करें। URLDecode (स्ट्रिंग) इसे वापस स्विच करने के लिए।

इस तरह आपको इनपुट सत्यापन बंद नहीं करना है और यह अन्य प्रोग्रामर के लिए अधिक स्पष्ट होगा कि स्ट्रिंग में HTML सामग्री हो सकती है।


7

मैंने प्रत्येक पोस्टबैक से पहले जावास्क्रिप्ट का उपयोग करना समाप्त कर दिया, जो आप नहीं चाहते थे, जैसे कि:

<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;
}

दी मेरा पेज ज्यादातर डेटा प्रविष्टि है, और बहुत कम तत्व हैं जो पोस्टबैक करते हैं, लेकिन कम से कम उनके डेटा को बनाए रखा जाता है।


छोटे ब्रैकेट के बजाय बड़े ब्रैकेट होने चाहिए। जैसे `if (tbs [i] .type == 'text') {` के स्थान पर {if '(t (i) .type ==' text ') {`
शिल्पा सोनी

5

आप कुछ का उपयोग कर सकते हैं जैसे:

var nvc = Request.Unvalidated().Form;

बाद में, nvc["yourKey"]काम करना चाहिए।


धन्यवाद, आपका जवाब मेरे पास बहुत समय बचा लिया
हबीब

4

जब तक ये केवल "<" और ">" (और दोहरे उद्धरण ही नहीं) वर्ण हैं और आप इन्हें संदर्भ में उपयोग कर रहे हैं जैसे <input value = " this " />, आप सुरक्षित हैं (<textarea के लिए) > यह एक </ textarea> आप निश्चित रूप से कमजोर होगा)। यह आपकी स्थिति को आसान बना सकता है, लेकिन कुछ भी अधिक के लिए अन्य पोस्ट किए गए समाधानों में से एक का उपयोग करें।


4

यदि आप अपने उपयोगकर्ताओं को यह बताना चाहते हैं कि <और> BUT का उपयोग नहीं किया जा रहा है, तो आप नहीं चाहते कि पूरा फॉर्म संसाधित / पोस्टेड वापस हो जाए (और सभी इनपुट खो दें) इससे पहले कि आप बस एक में नहीं डाल सकते उन (और शायद अन्य संभावित रूप से खतरनाक) पात्रों के लिए क्षेत्र के चारों ओर सत्यापनकर्ता?


पोस्ट ने कहा कि "सत्यापनकर्ता" कृपया
mxmissile

4

किसी भी सुझाव ने मेरे लिए काम नहीं किया। मैं किसी भी तरह से पूरी वेबसाइट के लिए इस सुविधा को बंद नहीं करना चाहता था क्योंकि 99% समय मैं नहीं चाहता कि मेरे उपयोगकर्ता HTML को वेब रूपों पर रखें। मैंने इस पद्धति के आसपास अपना काम खुद बनाया है क्योंकि मैं इस विशेष एप्लिकेशन का उपयोग कर रहा हूं। मैं इनपुट को पीछे के कोड में HTML में परिवर्तित करता हूं और इसे अपने डेटाबेस में सम्मिलित करता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.