1

我有以下视图模型,它接受密码更改值。因此,它应该接受特殊字符,包括触发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在服务器上设置并在视图中使用。

当我输入诸如“<Script/>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
  • 我覆盖了just 的BindModel方法,DefaultModelBinder看看它是否抛出异常,但它没有。
  • 我将堆栈跟踪中提到的 Application Insights 升级到了最新版本,从 2.16 到 2.20。
  • 该模型直接在属性上具有其属性。[MetadataType]我尝试使用属性将它们移动到元数据类型。它起作用了,只是仍然抛出了异常。

在这一点上,我不知道为什么抛出异常,以及如何防止或捕获它。任何帮助表示赞赏。

4

1 回答 1

0

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

于 2022-01-03T19:09:41.700 回答