【问题标题】:HttpRequestValidationException is thrown despite having [AllowHtml] attribute尽管具有 [AllowHtml] 属性,但仍引发 HttpRequestValidationException
【发布时间】:2022-01-02 14:20:06
【问题描述】:

我有以下视图模型,它接受密码更改值。因此,它应该接受特殊字符,包括触发HttpRequestValidationException - '' 的字符。所以我在相应的属性上添加了[AllowHtml] 属性:

    public class ChangePasswordModel
    {
        public bool ShowPassword { get; set; }

        public string UserMessage { get; set; }

        [Required]
        [StringLength(int.MaxValue, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 8)]
        [ValidPassword]
        [DataType(DataType.Password)]
        [Display(Name = "Password")]
        [AllowHtml]
        public string Password { get; set; }

        [DataType(DataType.Password)]
        [Required]
        [Display(Name = "Confirm password")]
        [Compare(nameof(Password), ErrorMessage = "The {1} and {0} do not match.")]
        [AllowHtml]
        public string ConfirmPassword { get; set; }
    }

这里ShowPasswordUserMessage在服务器上设置,在视图中使用。

当我输入诸如“1234”之类的密码时,一切正常,模型验证,执行操作,执行ViewResult,然后在ViewResult和客户端之间的某个位置,HttpRequestValidationException 会随此堆栈跟踪抛出:

Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule.OnExecuteRequestStep(HttpContextBase context, Action step)
Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule.OnExecuteRequestStep(HttpContextBase context, Action step)

我在 Global.asax.cs 中的 Application_Error 事件中发现了它,在该事件中,除了一般消息之外,向用户返回任何有用信息都为时已晚。

我尝试了什么:

  • 我有一个全局HandleErrorAttribute,我在其中检测到HttpRequestValidationException,并将其作为视图中的验证消息返回给用户。当用户在不允许的地方输入 HTML 时,这适用于其他模型和视图,但在这种情况下,不会触发属性的 OnException 覆盖。
  • 我用上面的属性修饰了具体的动作
  • 我在上面的属性中实现了IResultFilter并覆盖了OnResultExecuted,以测试视图执行后是否抛出异常。 ResultExecutedContext.Exception 属性为 null
  • 我重写了DefaultModelBinderBindModel 方法只是为了查看它是否抛出异常,但它没有。
  • 我将堆栈跟踪中提到的 Application Insights 升级到了最新版本,从 2.16 升级到 2.20。
  • 此模型的属性直接在属性上。我尝试使用 [MetadataType] 属性将它们移动到元数据类型。它起作用了,只是仍然抛出了异常。

此时,我不知道为什么会抛出异常,以及如何防止或捕获它。任何帮助表示赞赏。

【问题讨论】:

    标签: c# asp.net-mvc-5 request-validation


    【解决方案1】:

    看来,如果您需要允许,您只需要使用 "[ValidateInput(false)]" 属性而不是 "[AllowHtml]" 属性脚本标签。查看ValidateInput(false) vs AllowHtml 线程了解更多信息。

    【讨论】:

    • 我试过了。令人惊讶的是,它没有用。 ValidateInput 阻止请求验证之前操作,但在这种情况下,某些东西正在执行请求验证之后操作和 ActionResult 执行。
    • 唯一可以禁用请求验证的方法是设置<httpRuntime requestValidationMode="0.0" />,这当然会为整个应用程序禁用它。
    猜你喜欢
    • 2011-10-06
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多