2008-10-30 7 views
36

का कारण बनता है, मैं सिर्फ एएसपी.नेट एमवीसी में उपयोगकर्ता इनपुट को सत्यापित करने (या साफ़) करने के बारे में जानना चाहता हूं ताकि एक HttpRequestValidationException को फेंक दिया नहीं जा सकेगा मूल्य जमा उदाहरण के लिए, एक टेक्स्ट इनपुट के साथ, यदि उपयोगकर्ता <BR/> इनपुट करता है, तो यह अपवाद का कारण बन जाएगा और पीला स्क्रीन ऑफ डेथ दिखाया जाएगा। मुझे वह नहीं चाहिए। मैं अपवाद को पकड़ना चाहता हूं और वर्तमान दृश्य में उपयोगकर्ता के अनुकूल त्रुटि को दिखाना चाहता हूं, अधिमानतः सबमिट किए गए समान मानों के साथ लोड किए गए नियंत्रणों के साथ।एएसपी.नेट एमवीसी में HttpRequestValidationException से बचने के लिए कैसे एक ही दृश्य प्रस्तुत करता है जो अपवाद

मुझे यह http://www.romsteady.net/blog/2007/06/how-to-catch-httprequestvalidationexcep.html मिला है, लेकिन यह मेरे उद्देश्य के लिए बेकार है। इसके अलावा, मुझे यह http://msdn.microsoft.com/en-us/library/aa973813.aspx मिला है और मॉडल बाइंडर के अंदर डालने की कोशिश की लेकिन मैं काम नहीं कर सका।

+2

वाईएसओडी के लिए +1। अच्छा लगा। –

उत्तर

38
(इस लेखन के समय में आर सी,) ASP.NET MVC के नवीनतम संस्करण के साथ

तुम सिर्फ या तो अपने नियंत्रक वर्ग या अपनी कार्रवाई विधि, जैसे पर एक विशेषता रख सकते हैं:

[ValidateInput(false)] 
public ActionResult create() 
{ 
    // ...method body 
} 

ValidateInputAttribute System.Web.Mvc में है।

लेकिन जैसा कि अन्य ने कहा है, तो आपको अपना मैन्युअल इनपुट सत्यापन या सफाई करना होगा।

MVC 3 का प्रयोग करके आप यह सुनिश्चित करना चाहिए कि यह आपके Web.config में है: <system.web><httpRuntime requestValidationMode="2.0" /></system.web>

+3

यह बहुत अच्छा होगा अगर ValidateInputAttribute किसी फ़ील्ड (या नामों की एक सूची) का नाम स्वीकार करेगा, ताकि सत्यापन को चुनिंदा रूप से बंद कर दिया जा सके। सभी या कुछ भी चूसने लगता है, प्रयास की नकल का कारण बनता है, और आम तौर पर चीजों को और अधिक परेशानी बनाता है। –

+9

एमवीसी 3 का उपयोग करके, आपको यह भी सुनिश्चित करना होगा कि यह आपके वेब.कॉन्फिग में है: '' –

0

अपने एएसपीएक्स दृश्य घोषणा के लिए ValidateRequest = "false" डालें, लेकिन कुछ एक्सएसएस हमलों से बचने के लिए, अपने कोड के अंदर उपयोगकर्ताओं इनपुट इनपुट को स्वच्छ करें।

+0

धन्यवाद, लेकिन मैं अपने एएसपीएक्स पर ValidateRequest को निष्क्रिय नहीं करना चाहता हूं। – eKek0

1

global.asax में त्रुटि को पकड़ने के बजाय एप्लिकेशन_इरर, आप नियंत्रक के लिए एक त्रुटि हैंडलर जोड़कर इसे पकड़ सकते हैं जो स्पष्ट रूप से इस त्रुटि को पकड़ता है और एक त्रुटि संदेश और उपयुक्त दृश्य डेटा के साथ दृश्य पर रीडायरेक्ट करता है।

मुझे यह कुछ हद तक पुराना, post गुणों के साथ ऐसा करने के तरीके पर मिला।

+0

धन्यवाद, मैं इसे अब कोशिश करूँगा – eKek0

1

ValidateInputAttribute अनुरोध सत्यापन अक्षम करने के लिए उचित तरीका है। दृश्य (एएसपीएक्स) के भीतर घोषणात्मक विधि काम नहीं करती है क्योंकि नियंत्रक अनुरोध प्राप्त करने के लिए ज़िम्मेदार है (देखें/एएसपीएक्स नहीं)।

4

कैसे इस को पकड़ने के लिए (और अन्य) एक फिल्टर के साथ अपवाद देखें की एक बहुत विस्तृत उदाहरण के लिए: http://code.google.com/p/geochat/source/browse/Source/Web/GeoChat.MvcExtensions/ExceptionHandlerAttribute.cs

यह आप पर मान्यता जारी रख पाएंगे, लेकिन "के पीले स्क्रीन देखने से उपयोगकर्ता को रोकने के मौत"।

यह एक सरल (शायद oversimplified) संस्करण है:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true), AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] 
public class ExceptionHandlerAttribute : FilterAttribute, IExceptionFilter { 

private HandleErrorAttribute attribute = new HandleErrorAttribute(); 

public ExceptionHandlerAttribute() { 
    this.ExceptionType = typeof(Exception); 
    this.Order = 1; 
} 

public string View { 
    get { 
    return attribute.View; 
    } 
    set { 
    attribute.View = value; 
    } 
} 

public Type ExceptionType { 
    get { 
    return attribute.ExceptionType; 
    } 
    set { 
    attribute.ExceptionType = value; 
    } 
} 

public void OnException(ExceptionContext filterContext) { 
    if (this.ExceptionType.IsInstanceOfType(filterContext.Exception)) { 
    string controller = (string)filterContext.RouteData.Values["controller"]; 
    string action = (string)filterContext.RouteData.Values["action"]; 
    if (controller == null) 
     controller = String.Empty; 

    if (action == null) 
     action = String.Empty; 

    HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controller, action); 
    ViewResult result = new ViewResult(); 
    result.ViewName = this.View; 
    result.MasterName = String.Empty; 
    result.ViewData = new ViewDataDictionary<HandleErrorInfo>(model); 

    result.TempData = filterContext.Controller.TempData; 
    filterContext.Result = result; 

    filterContext.ExceptionHandled = true; 
    filterContext.HttpContext.Response.Clear(); 
    filterContext.HttpContext.Response.StatusCode = 500; 
    } 
} 

} एएसपी में

11

MVC 3 आप अपने मॉडल में अलग-अलग क्षेत्रों/गुणों पर [AllowHtml] विशेषता का उपयोग कर सकते हैं/ViewModel सत्यापन बंद करने के लिए सिर्फ उस क्षेत्र के लिए, जो बहुत अच्छा है। मैं इस मॉडल को अपने मॉडल में कुछ फ़ील्ड में जोड़ूंगा, और उसके बाद Sanitizer.GetSafeHtmlFragment(mymodel.Description) पर कॉल करके उपयोगकर्ता इनपुट को स्वच्छ करने के लिए उत्कृष्ट AntiXSS लाइब्रेरी (NuGet के माध्यम से भी उपलब्ध) का उपयोग करें (जहां "विवरण" संपत्ति मेरे दृश्य मॉडल पर एक स्ट्रिंग प्रॉपर्टी है, जिसमें [AllowHtml] विशेषता लागू है)

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