2012-03-14 16 views
11

में अनुरोध सत्यापन को ओवरराइड कैसे कर सकता हूं मुझे उन अनुरोधों में समस्याएं आ रही हैं जिनमें वेब एपीआई यूआरएल के हिस्से के रूप में 'खतरनाक पात्र' शामिल हैं। यूआरएल में & शामिल है जो ठीक से यूआरएल एन्कोड किया गया है, लेकिन फिर भी अनुरोध सत्यापन ASP.NET त्रुटि का कारण बनता है।मैं ASP.NET WebAPI

एमवीसी के विपरीत इस कार्यक्षमता को बल देने और अक्षम करने के लिए कोई [ValidateInput (false)] विशेषता नहीं प्रतीत होती है।

उत्तर

8

बाहर कर देता है जवाब का उपयोग कर web.config में यह करने के लिए है:

<system.web> 
    <httpRuntime requestPathInvalidCharacters="" /> 
</system.web> 

आप इस विश्व स्तर पर या उप निर्देशिका स्तर पर सेट कर सकते हैं। आप केवल कुछ पथों के नीचे इस सेटिंग को निर्दिष्ट करने के लिए <location path=""> तत्व का लाभ उठा सकते हैं।

<location path="api/images"> 
    <system.web> 
    <httpRuntime requestPathInvalidCharacters="" /> 
    </system.web> 
</location> 

अधिक जानकारी:: https://msdn.microsoft.com/en-us/library/e1f13641(v=vs.100).aspx

+0

यह एकमात्र समाधान है जो मेरे लिए काम करता है। 'RequestValidationMode =' 2.0'' को web.config में जोड़ना और कार्रवाई विधि पर '[ValidateInput (false)] विशेषता का प्रयास नहीं किया।मैंने अनुरोध के बाद काम करना शुरू कर दिया 'अनुरोधपैलिड कैरेक्टर = "" '। मुझे लगता है कि ऐसा इसलिए है क्योंकि यहां त्रुटि Request.Form सत्यापन के बजाय Request.Path सत्यापन का हिस्सा है। – quakkels

+0

इसे वैश्विक होने की आवश्यकता नहीं है, पथ को प्रतिबंधित करने के लिए बस 'स्थान' तत्व का उपयोग करें। तो यदि आपका वेब एपीआई रूट 'एपीआई/फू' के अंतर्गत है तो आप स्थान को 'path = "api/foo" पर प्रतिबंधित कर सकते हैं और 'httpRuntime' कॉन्फ़िगरेशन जोड़ सकते हैं। पुष्टि की यह आईआईएस में ठीक काम करता है। एमएसडीएन ने स्पष्ट रूप से कहा है कि मशीन, साइट, एप्लिकेशन और उपनिर्देशिका स्तर पर घोषित '' घोषित किया जा सकता है। मैंने जवाब अपडेट किया। – kamranicus

1

प्रति @Levi हमारे वेब सुरक्षा पुरुष:

उदाहरण के लिए, यदि आपका वेब एपीआई मार्ग कि प्रभावित था रहते थे नीचे API/छवियों आप निम्न कर सकता है ऐसा करने का एकमात्र तरीका कॉन्फ़िगर करना है। यहां तक ​​कि एमवीसी की [ValidateInput (झूठी)] इस विशेष परिदृश्य में मदद नहीं करेगा।

इसे में अक्षम करना Web.config आवश्यक एक भयानक विचार नहीं है। यदि आप अविश्वसनीय डेटा को सत्यापित और एन्कोड करके अच्छी सुरक्षा अभ्यास का पालन कर रहे हैं, तो इसे एप्लिकेशन-व्यापी लागू करने के लिए बिल्कुल ठीक है।

+0

'[प्रमाणीकरण इनपुट (झूठा)] 'मेरे मामले में काम नहीं करता है। मुझे लगता है कि ऐसा इसलिए है क्योंकि '[ValidateInput (false)]' Request.Path' के बजाय 'Request.Form' को संदर्भित करता है। – quakkels

2

अनुरोध सत्यापन के साथ कॉन्फ़िगरेशन में 4.0 पर सेट किया गया उत्तर उत्तर नहीं है। हालांकि आप 2.0 अनुरोध सत्यापन पर वापस लौट सकते हैं, जिस स्थिति में एमवीसी विशेषता आपके काम की अपेक्षा करता है: डिफ़ॉल्ट रूप से मान्य करें और आवश्यकता होने पर स्पष्ट रूप से ओवरराइड करें।

<httpRuntime executionTimeout="300" requestValidationMode="2.0" /> 

इस और विकल्प यहाँ से कुछ के बारे में विस्तार से बात की: http://www.west-wind.com/weblog/posts/2010/Aug/19/RequestValidation-Changes-in-ASPNET-40

+0

यह एकमात्र विकल्प है जो मेरे लिए काम करता है। – santos

2

आपको लगता है कि विरासत में एक कस्टम प्रकार के httpRuntime तत्व की requestValidationType विशेषता सेटिंग से इस पर और अधिक कुशल नियंत्रण प्राप्त कर सकते हैं System.Web.Util.RequestValidator से और IsValidRequestString ओवरराइड करता है।

दुर्भाग्यवश यह वेबएपीआई पाइपलाइन का हिस्सा नहीं है, इसलिए सीधे एक्शन फ़िल्टर जैसी चीजों की जांच नहीं कर सकता (यानी नियंत्रक विधियों पर विशेषताओं)।

हालांकि, यदि आप विशेष रूप से फॉर्म फ़ील्ड के सत्यापन के बारे में परवाह करते हैं, तो सत्यापनकर्ता इन तक पहुंच नहीं पाते हैं, जब तक आप उन्हें एक्सेस नहीं करते हैं, जो एक्शन फ़िल्टर को निकाल दिए जाने के बाद होता है, इसलिए आप एक विशेषता का उपयोग करके सत्यापन का विकल्प निकाल सकते हैं निम्नलिखित की तरह कक्षाएं बनाने ...

public class AllowFormHtmlAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     HttpContext.Current.Items["AllowFormHtml"] = true; 
    } 
} 

public class CustomRequestValidator : RequestValidator 
{ 
    protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex) 
    { 
     if (context.Items["AllowFormHtml"] as bool? == true && requestValidationSource == RequestValidationSource.Form) 
     { 
      validationFailureIndex = 0; 
      return true; 
     } 

     return base.IsValidRequestString(
      context, value, requestValidationSource, collectionKey, out validationFailureIndex); 
    } 
} 

... तो बस, [AllowFormHtml]

हालांकि साथ अपने नियंत्रक विधि व्याख्या आप HttpRequest से सीधे प्रपत्र फ़ील्ड्स पर पहुंचते हैं तो, यह HttpRequest.Unvalidated उपयोग करने के लिए आसान है , जो सत्यापन को बाईपास करता है।

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