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




asp.net-mvc validation (20)

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

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

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

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

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

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

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

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


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

उदाहरण:

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

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


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

var nvc = Request.Unvalidated().Form;

Later, nvc["yourKey"] should work.


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

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


एएसपी.नेट 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 के अंदर इसे नियंत्रित करना सुरक्षित है, क्योंकि आप साइट स्तर पर देख सकते हैं जो पेज मार्कअप को इनपुट के रूप में अनुमति देता है।

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


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

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

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

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

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

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

एक और समाधान है:

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

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

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

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


कृपया ध्यान रखें कि कुछ .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> को अपने पृष्ठ में आउटपुट होने से और बाद में निष्पादित किया गया।

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


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

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

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

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


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

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

देखें: http://www.procheckup.com/PDFs/bypassing-dot-NET-ValidateRequest.pdf


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

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

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

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

के बजाय

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

यह करो

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

@Html.Raw । चाल ने चाल की।

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


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

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

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


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

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

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


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

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

यदि आप फ्रेमवर्क 4.0 का उपयोग कर रहे हैं तो web.config में प्रविष्टि (<pages 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>

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

<%@ Page EnableEventValidation="false" %>

यदि आपके पास पहले से <% @ पृष्ठ जैसा कुछ है तो बस बाकी => EnableEventValidation="false" %> जोड़ें

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


कारण

डिफ़ॉल्ट रूप से 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 त्रुटि: क्लाइंट से एक संभावित खतरनाक अनुरोध। फॉर्म मान पता चला था


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?





request.form