asp.net एक संभावित खतरनाक अनुरोध। क्लाइंट से फॉर्म मान का पता चला था




asp.net-mvc validation (24)

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

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

अपवाद और दिखा रहा है

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

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

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

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

क्या मैं एक हैंडलर से ऐसा कर सकता हूं?


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

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

माना जाता है कि मेरा पृष्ठ अधिकतर डेटा प्रविष्टि है, और बहुत कम तत्व हैं जो पोस्टबैक करते हैं, लेकिन कम से कम उनका डेटा बरकरार रखा जाता है।


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


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

<httpRuntime requestValidationMode="2.0" />

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

requestValidationMode="2.0"

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

validateRequest="false"

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

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

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

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


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

[ValidateInput (गलत)]

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


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

उदाहरण:

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

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

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

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

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


यदि आप 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

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

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

सर्वर का उपयोग करने के बजाय। HTML एन्कोड आपको माइक्रोसॉफ्ट एसीई टीम से नई, अधिक पूर्ण एंटी-एक्सएसएस लाइब्रेरी को देखना चाहिए।


कारण

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

उपाय

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

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

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

<pages validateRequest ="false" />

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

<httpRuntime requestValidationMode = "2.0" />

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

द्वारा संदर्भ: एएसपी.Net त्रुटि: क्लाइंट से एक संभावित खतरनाक अनुरोध। फॉर्म मान पता चला था


None of the suggestions worked for me. I did not want to turn off this feature for the whole website anyhow because 99% time I do not want my users placing HTML on web forms. I just created my own work around method since I'm the only one using this particular application. I convert the input to HTML in the code behind and insert it into my database.


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

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

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

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

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

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

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


यदि आप 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;
    }
}

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

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

एएसपी.नेट एमवीसी में आपको 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) {
    ...
}

जब तक ये केवल "<" और ">" (और डबल कोट स्वयं नहीं) वर्ण होते हैं और आप उन्हें संदर्भ में उपयोग कर रहे हैं जैसे <इनपुट मूल्य = " यह " />, आप सुरक्षित हैं (जबकि <textarea के लिए > this one </textarea> you would be vulnerable of course). That may simplify your situation, but for anything more use one of other posted solutions.


इस सवाल का जवाब सरल है:

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

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


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

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

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

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


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

var nvc = Request.Unvalidated().Form;

Later, nvc["yourKey"] should work.


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

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

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

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

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

मुझे नहीं पता कि क्या कोई डाउनसाइड्स हैं, लेकिन मेरे लिए यह अद्भुत काम करता है।


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

अनुकूल संदेश प्रदर्शित करें:

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

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

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

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

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


If you're just looking to tell your users that < and > are not to be used BUT, you don't want the entire form processed/posted back (and lose all the input) before-hand could you not simply put in a validator around the field to screen for those (and maybe other potentially dangerous) characters?


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

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







request.form