3

我有我的应用程序,安全测试团队报告了一个关于用户可能从我们的表单输入中注入恶意代码的错误。该应用程序是在 ASP.NET MVC4、.NET 4.5 和 EF 5 中开发的。

正在测试的攻击就像输入任何通常的 html 一样,但我的同事没有使用常规的 < 或 >,而是使用 < 和 >(之前字符的全角 unicode 版本:此处为完整列表)。MVC 让这些字符通过,然后,以某种方式,ORM 删除了字符的“宽”部分,并将标准和普通字符留在数据库中。不用说,如果在视图的输出中没有正确编码,这些字符的检索和渲染可能会导致 XSS 漏洞。

我现在需要的是一种对应用程序中以任何形式提交的所有字符串进行清理和执行 Normalize() 的方法。有人告诉我创建一个自定义模型绑定器,但是在 BindModel 方法中我找不到修改字段的位置,所以稍后框架可以识别清理后的值并识别注入。

任何建议将不胜感激。

4

1 回答 1

3

您可以改为提供自定义请求验证。

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>

如果还想规范化您在控制器中收到的字符串,请实现自定义ValueProviderFactory. 请参阅价值提供者和模型绑定器之间的区别是什么?

注意:如果您选择仅实现 a ValueProviderFactory,则必须调用RequestValidator.Current手动验证规范化字符串。

于 2014-02-15T03:19:43.797 回答