2009-01-28 13 views
30

मेरे पास एक एएसपी.नेट एमवीसी फॉर्म है जो (आमतौर पर करता है) एक प्रतिक्रिया सबमिट करता है जो "एक संभावित खतरनाक अनुरोध। टॉर्म मान क्लाइंट के रूप में पता चला था" त्रुटि को ट्रिगर करेगा।क्या किसी पृष्ठ की ValidateRequest सेटिंग ओवरराइड हो सकती है?

इस के आसपास जाने की कोशिश करने के लिए, मैंने पृष्ठ निर्देश में एक ValidateRequest = "false" रखा है।

केवल समस्या: मुझे अभी भी त्रुटि मिल रही है!

<pages validateRequest="false" 
     pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" 
     pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" 
     userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> 
    <controls> 
     <add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" /> 
    </controls> 
</pages> 

तो, validateRequest:

अब, सभी अच्छा था जब तक मैं इस सुबह ASP.NET MVC आर सी के लिए अद्यतन, और (रीडमी के अनुसार), दृश्य web.config में निम्नलिखित रखा सभी पृष्ठों के लिए गलत होना चाहिए, है ना? मैं क्या खो रहा हूँ?

+0

दृश्य वेब.कॉन्फिग केवल दृश्य फ़ोल्डर पर सर्फ करते समय लागू होता है, है ना? – bzlm

+0

हां, यह सही है। –

उत्तर

62

एमवीसी में, नियंत्रक स्तर पर सत्यापन पृष्ठ स्तर पर नहीं होता है। यह देखने के लिए, यह क्यों मानते हैं कि उस समय नियंत्रक कार्रवाई निष्पादित हो रही है, हम नहीं जानते कि प्रस्तुत करने के लिए कौन सा दृश्य चुना जाएगा। (वास्तव में, नियंत्रक कार्रवाई भी एक दृश्य प्रस्तुत नहीं कर सकती है! यह क्लाइंट पर फ़ाइल डाउनलोड प्रॉम्प्ट खोल सकता है।) इसके अतिरिक्त, यदि कोई उपयोगकर्ता सर्वर पर दुर्भावनापूर्ण इनपुट सबमिट कर रहा है, तब तक जब दृश्य प्रस्तुत किया जाता है इसके बारे में कुछ भी करने में बहुत देर हो चुकी है। नियंत्रक पहले से ही डेटाबेस में खतरनाक इनपुट किया होगा।

इसके बजाय, कृपया नियंत्रक या क्रिया [वैलिडेट इनपुट (झूठी)] के साथ कार्रवाई को सजाने के लिए। इससे हमें उस नियंत्रक या कार्रवाई के लिए अनुरोध सत्यापन को दबाने का कारण बन जाएगा।

+0

इससे बहुत मदद मिली। –

+0

दरअसल, धन्यवाद! – Aaron

+0

+1 न केवल एक उत्तर प्रदान करने के लिए, बल्कि यह प्रदान करता है कि यह क्यों कार्य करता है। कुछ अच्छा करने के बारे में जानना हमेशा अच्छा होता है, लेकिन यह जानने के लिए हमेशा बेहतर होता है कि कुछ क्यों करें – JakeJ

2

हम एक आधार नियंत्रक है कि हमारे नियंत्रकों से विरासत है हमें को निष्क्रिय आंतरिक ASP.NET अनुरोध सत्यापन विश्व स्तर पर करने की इजाजत दी:

protected override void Initialize(RequestContext requestContext) 
    { 
     // no client input will be checked on any controllers 
     ValidateRequest = false; 
     base.Initialize(requestContext); 
    } 

बस यह सुनिश्चित कर लें कि आप सत्यापित करें ग्राहक से सभी इनपुट!

17

यह `आवश्यक नियंत्रक या विशेषता के साथ कार्रवाई [ValidateInput (गलत)] सजाने और requestValidationMode =" 2.0 "के लिए web.config फ़ाइल जोड़ें: उदाहरण:

नियंत्रक:

[ValidateInput(false)] 
    public class MensajesController : Controller 
    { 
     //or in an action 
     [ValidateInput(false)] 
     [HttpPost] 
     public ActionResult Create(FormCollection collection) 
     { 
     } 
    } 

विन्यास फाइल:

<configuration> 
     <system.web> 
      <httpRuntime requestValidationMode="2.0"/> 
     </system.web> 
    </configuration> 
+3

हां, अनुरोध ValidationMode को .NET 4 के लिए सेट करने की आवश्यकता है। अद्यतन के लिए धन्यवाद। –

2

मैं ASP.NET MVC 3 का उपयोग .NET 4 के साथ एक समान मुद्दा था।0 और Windows Azure अभिगम नियंत्रण सेवा वी 2, जहां मैं त्रुटि मिलेगा:

:

System.Web.HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client (wresult="<t:RequestSecurityTo..."). 

और मान्यता को बंद करने की तुलना में एक बेहतर समाधान पाया इस आलेख में वर्णित के रूप में एक कस्टम RequestValidator लागू करने के लिए था http://social.technet.microsoft.com/wiki/contents/articles/windows-identity-foundation-wif-a-potentially-dangerous-request-form-value-was-detected-from-the-client-wresult-quot-lt-t-requestsecurityto-quot.aspx

public class SampleRequestValidator : RequestValidator 
{ 
    protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex) 
    { 
     validationFailureIndex = 0; 
     if (requestValidationSource == RequestValidationSource.Form && collectionKey.Equals(WSFederationConstants.Parameters.Result, StringComparison.Ordinal)) 
     { 
      SignInResponseMessage message = WSFederationMessage.CreateFromFormPost(context.Request) as SignInResponseMessage; 
      if (message != null) 
      { 
       return true; 
      } 
     } 
     return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex); 
    } 
} 

एकमात्र कारण मैं सत्यापन को बंद करने की तुलना में आगे देखा गया था क्योंकि मैं इस काम के लिए जब विंडोज Azure मंच प्रशिक्षण किट में इस ट्यूटोरियल निम्नलिखित सत्यापन बंद किए बिना भी देखा था:

http://msdn.microsoft.com/en-us/WAZPlatformTrainingCourse_IntroToACSLabsV2

वैसे भी, उम्मीद है कि यह किसी को फायदा नहीं होगा और भविष्य में इस समस्या को हल करने के बीच एक और सुव्यवस्थित दृष्टिकोण प्रदान कर सकते हैं। यह ध्यान दिया जाना चाहिए कि यदि आप कस्टम RequestValidator को लागू करते हैं तो अनुरोध ValidationMode = "2.0" की आवश्यकता नहीं है।

संबंधित मुद्दे