序言:我已经阅读了许多有关解决“潜在危险的请求”错误的问题:
还有很多。我知道如何通过几种不同的方法修复,但是我不想关闭请求验证。
我想向所有字符串视图模型属性站点范围添加表单验证,以防止出现“潜在危险的请求”异常,因为如果用户可以更正则抛出异常是不理想的他们的投入。我只能想到两种不同的解决方案:
向每个接受string
数据类型的视图模型属性添加一个正则表达式验证器,该数据类型在浏览器上执行。这样可以防止表单提交,但是对于我们的应用程序来说,这是很多工作的明智选择
以某种方式神奇地添加了一个验证器,该验证器在执行此验证的所有字符串视图模型属性上触发的每个请求上执行,并向用户提供比“厄运黄屏(tm)”更友好的消息。
无论解决方案如何,表单字段应显示的验证消息应类似于:
X字段包含潜在危险的字符。删除所有'<'字符,或确保在它们之前出现空格或标点符号。
或其他有影响的东西。基本上,我想要一个验证消息,它可以帮助用户解决这种情况,而不是将整个应用程序吹得高高在上,这会使他们失去将数据输入表格的所有工作。
我确实提出了一个解决方案,其中涉及为字符串属性添加一个自定义模型绑定程序,以在不触发验证的情况下获取属性的值,然后使用正则表达式对其进行测试。正则表达式上的匹配会导致将新的模型状态错误添加到该属性。
public class MaliciousStringInputModelBinder : IModelBinder
{
private static readonly Regex maliciousStringPattern = new Regex(@"<[a-zA-Z0-9]");
private const string validationMessageFormat = "The {0} field contains potentially dangerous characters. Either remove the '<' characters, or ensure a space or puncuation character immediately follows them.";
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
// Call extension method to safely get model value without
// triggering any validations
var valueResult = controllerContext.GetValueFromProvider(bindingContext);
if (valueResult == null || valueResult.AttemptedValue == null)
{
return null;
}
else if (valueResult.AttemptedValue == string.Empty)
{
return string.Empty;
}
else if (maliciousStringPattern.IsMatch(valueResult.AttemptedValue))
{
bindingContext.ModelState.AddModelError(bindingContext.ModelName, string.Format(validationMessageFormat, bindingContext.ModelMetadata.DisplayName));
}
bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueResult);
return valueResult.AttemptedValue;
}
}
这有效,但感觉像是黑客。我没有绑定模型属性,而是对其进行验证。
我一直在研究ASP.NET MVC动作过滤器,但我又一次在没有明确解决方案的情况下跳过很多圈。
如何在ASP.NET MVC中向站点范围内的所有字符串视图模型属性添加通用表单验证,以向用户显示验证消息,而不是引发异常?