c# - 如何在请求验证进入 MVC 4 之前清理输入?

标签 c# asp.net-mvc asp.net-mvc-4 custom-model-binder unicode-normalization

我有我的应用程序,我从安全测试团队那里收到了一个错误报告,该错误报告了用户可能会从我们的表单输入中注入(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/

相关文章:

c# - 单击按钮时在表单之间传递变量

c# - .net 数据集主键 - 强制唯一性?

c# - 从数据库中检索所有数据得到第二行与第一行相同

c# - 如何在 C# 中调试 "Unable to create a constant value of type ' System.Object'"?

c# - 无法加载文件或程序集“System.Web.Helpers,IIS 8 上的错误

c# - 空引用异常数组 2d

c# - 从 MS Access 数据库获取 Long 后使用 OleDbDataReader.GetInt64() 时出现 System.InvalidCastException

c# - 使用 Select Many 在 LINQ 方法语法中有条件地插入 Where 子句

asp.net-mvc - IIS 7.5。无法禁用 URL 重写规则(我删除了规则,但它们仍然影响)

jquery - 使用 jquery post 将字典数据传递给 Controller ​​字符串方法