【发布时间】:2018-12-21 11:52:14
【问题描述】:
我想限制用户提供 html 标签作为输入。
那么如何在我的 Asp.Net MVC 项目的 web.config 文件中全局处理它。
我使用了ValidateInput(false),但它完全允许html标签保存在db中。
【问题讨论】:
我想限制用户提供 html 标签作为输入。
那么如何在我的 Asp.Net MVC 项目的 web.config 文件中全局处理它。
我使用了ValidateInput(false),但它完全允许html标签保存在db中。
【问题讨论】:
默认情况下,在 MVC 中启用 XSS 验证。因此,您不必限制 HTML 的输入(它已经受到限制),而是只允许对您标记的某些 Actions 或 ViewModel 属性进行 HTML 输入。
在 Action 上设置 [ValidateInput(false)] 属性将禁用对整个 Action 的验证。
在 ViewModel 属性上设置 [AllowHtml] 属性仅允许该属性的 HTML 输入。这是启用 HTML 输入的推荐方式。
要解决您的问题,您应该从 Action 中删除 [ValidateInput(false)]。
延伸阅读:Preventing XSS Attacks in ASP.NET MVC using ValidateInput and AllowHTML.
还要确保您在 web.config 中配置了正确的 requestValidationMode。 requestValidationMode 4.5 vs 2.0.
若要在输入验证失败时提供自定义错误消息,请在 Global.asax 中注册一个 IExceptionFilter,它会检查抛出的异常是否为 HttpRequestValidationException。
public class HttpRequestValidationExceptionFilter : FilterAttribute, IExceptionFilter {
public const int MySpecialStatusCodeIndicatingValidationError = 1337;
public void OnException(ExceptionContext filterContext) {
if (!filterContext.ExceptionHandled && filterContext.Exception is HttpRequestValidationException) {
// redirect to error controller, which shows custom message
filterContext.Result = new HttpStatusCodeResult(MySpecialStatusCodeIndicatingValidationError);
filterContext.ExceptionHandled = true;
}
}
}
有关处理带有特殊状态代码的错误的可能机制,请参阅ASP.NET MVC 404 Error Handling。这个想法是识别MySpecialStatusCodeIndicatingValidationError并重定向到自定义HttpErrorController中的正确操作。
【讨论】: