我有我的应用程序,我从安全测试团队那里收到了一个错误报告,该错误报告了用户可能会从我们的表单输入中注入(inject)恶意代码。 该应用程序是在 ASP.NET MVC4、.NET 4.5 和 EF 5 中开发的。
被测试的攻击就像输入任何普通的 html,但我的同事没有使用常规的 < 或 >,而是使用 < 和 >(前面字符的全角 unicode 版本:here for the full list)。 MVC 让这些字符通过,然后,ORM 以某种方式删除字符的“宽”部分,并将标准和普通字符留在数据库中。不用说,如果在 View 的输出中没有正确编码,这些字符的检索和呈现可能会导致 XSS 漏洞。
我现在需要的是一种对所有 应用程序中以任何 形式提交的字符串进行清理和执行Normalize() 的方法。 有人告诉我创建一个自定义模型绑定(bind)器,但在 BindModel 方法中我找不到修改字段的地方,所以稍后框架可以识别清理后的值并识别注入(inject)。
任何建议将不胜感激。
最佳答案
您可以改为提供自定义请求验证。
public class NormalizingRequestValidator : RequestValidator
{
protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
{
return base.IsValidRequestString(context, value.Normalize(NormalizationForm.FormKC), requestValidationSource, collectionKey, out validationFailureIndex);
}
}
在 web.config 中
<system.web>
<httpRuntime targetFramework="4.5" requestValidationType="YourNamespace.NormalizingRequestValidator, YourAssembly" />
</system.web>
如果还想规范化您在 Controller 中收到的字符串,请实现自定义 ValueProviderFactory
。参见 What’s the Difference Between a Value Provider and Model Binder?
注意:如果您选择只实现一个ValueProviderFactory
,您将必须调用RequestValidator.Current
来手动验证规范化字符串。
关于c# - 如何在请求验证进入 MVC 4 之前清理输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21788604/