在ASP.NET MVC中如何避免HttpRequestValidationException渲染引起exception的相同视图
我只想知道如何在ASP.NET MVC中validation(或清除)用户input,以便不pipe提交的值如何都不会抛出HttpRequestValidationException。 例如,用文本input,如果用户input<BR/>
,则会引发exception,并显示黄色死亡屏幕。 我不要那个。 我想捕捉exception,并在当前视图中显示一个用户友好的错误,最好是与提交相同的值加载的控件。
我发现这个http://www.romsteady.net/blog/2007/06/how-to-catch-httprequestvalidationexcep.html ,但它对我的目的是没用的。 另外,我发现这个http://msdn.microsoft.com/en-us/library/aa973813.aspx,并试图把模型粘合剂,但我不能让工作。
使用最新版本的ASP.NET MVC(RC,在写这篇文章的时候),你可以在你的控制器类或者操作方法上加一个属性,例如:
[ValidateInput(false)] public ActionResult create() { // ...method body }
ValidateInputAttribute在System.Web.Mvc中。
但正如其他人所说,你必须执行自己的手动inputvalidation或清理。
使用MVC 3,您还必须确保这是在您的Web.config: <system.web><httpRuntime requestValidationMode="2.0" /></system.web>
在ASP MVC 3中,你可以在你的Model / ViewModel的单个字段/属性上使用[AllowHtml]
属性来closures对这个字段的validation,这是非常好的。 我将这个属性添加到我的模型中的某些字段,然后使用优秀的AntiXSS库(也可以通过NuGet)通过调用Sanitizer.GetSafeHtmlFragment(mymodel.Description)
来清理用户input(其中“Description”属性是我的视图模型的string属性,应用了[AllowHtml]
属性)
有关如何使用筛选器捕获此(及其他)exception的详细示例,请参阅: http : //code.google.com/p/geochat/source/browse/Source/Web/GeoChat.MvcExtensions/ExceptionHandlerAttribute.cs
这将允许您保持validation,但防止用户看到“死亡的黄色屏幕”。
这是一个简化(可能过于简化)的版本:
[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; } }
}
而不是在global.asax Application_Error中捕获错误,您可以通过为显式捕获此错误的控制器添加error handling程序来捕获错误,并使用错误消息和相应的视图数据redirect到视图。
我发现这个有点老, 发表如何做到这一点与属性。
ValidateInputAttribute是禁用请求validation的正确方法。 视图(aspx)中的声明方法不起作用,因为控制器负责接收请求(而不是视图/ aspx)。
将放置ValidateRequest =“false”到您的aspx视图声明,但消毒用户input您的代码中的文本,以避免一些xss攻击。