代码之家  ›  专栏  ›  技术社区  ›  eKek0

如何避免ASP.NET MVC中的httpRequestValidationException呈现导致异常的同一视图

  •  36
  • eKek0  · 技术社区  · 16 年前

    我只想知道如何验证(或清除)ASP.NET MVC中的用户输入,这样无论提交的值如何,都不会抛出httpRequestValidationException。例如,如果用户输入 <BR/> ,将导致异常,并显示死亡的黄色屏幕。我不想那样。我希望捕获异常并在当前视图中显示用户友好的错误,最好是在加载控件时提交相同的值。

    我找到这个了 http://www.romsteady.net/blog/2007/06/how-to-catch-httprequestvalidationexcep.html 但这对我来说毫无用处。另外,我发现了这个 http://msdn.microsoft.com/en-us/library/aa973813.aspx 我试着放进一个模型活页夹,但我没法工作。

    6 回复  |  直到 13 年前
        1
  •  40
  •   Bryan Legend    13 年前

    使用最新版本的ASP.NET MVC(编写此命令时为RC),您只需在控制器类或操作方法上放置一个属性,例如:

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

    validateInputAttribute位于system.web.mvc中。

    但正如其他人所说,然后您必须执行自己的手动输入验证或清理。

    使用MVC 3,还必须确保它在web.config中: <system.web><httpRuntime requestValidationMode="2.0" /></system.web>

        2
  •  11
  •   Kevin Southworth    13 年前

    在ASP MVC 3中,可以使用 [AllowHtml] 模型/视图模型中各个字段/属性的属性,以仅关闭该字段的验证,这非常好。我将在模型中的某些字段中添加此属性,然后使用 AntiXSS 库(也可通过nuget)通过调用 Sanitizer.GetSafeHtmlFragment(mymodel.Description) (其中“description”属性是我的视图模型上的字符串属性,它具有 [允许HTML] 应用的属性)

        3
  •  4
  •   Scott    14 年前

    有关如何使用筛选器捕获此(和其他)异常的非常详细的示例,请参见: http://code.google.com/p/geochat/source/browse/Source/Web/GeoChat.MvcExtensions/ExceptionHandlerAttribute.cs

    这将允许您保持验证状态,但会阻止用户看到“死亡黄屏”。

    这是一个简化(可能过于简化)的版本:

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

    }

        4
  •  1
  •   tvanfosson    16 年前

    不是在global.asax应用程序的错误中捕获错误,而是通过为控制器添加一个错误处理程序来捕获错误,该控制器显式捕获此错误,并使用错误消息和适当的视图数据重定向到视图。

    我发现这个有点老, post 关于如何使用属性执行此操作。

        5
  •  1
  •   dariol    15 年前

    validateInputAttribute是禁用请求验证的正确方法。视图(aspx)中的声明性方法不起作用,因为控制器负责接收请求(而不是view/aspx)。

        6
  •  0
  •   Hrvoje Hudo    16 年前

    将validateRequest=“false”放到您的ASPX视图声明中,但是清除用户在代码中输入的文本,以避免一些XSS攻击。