【问题标题】:How to sanitize inputs before request validation enters in place in MVC 4?如何在请求验证进入 MVC 4 之前清理输入?
【发布时间】:2014-03-28 03:11:27
【问题描述】:

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

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

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

任何建议将不胜感激。

【问题讨论】:

  • 据我了解,这对我不起作用,因为我不想允许或限制我可能从输入中获得的 HTML 的某些部分,我要做的就是规范化删除所有全角 unicode 的字符串,以便 MVC 内置验证器可以对真实字符做出反应,而不会被伪装的字符欺骗。

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


【解决方案1】:

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

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。见What’s the Difference Between a Value Provider and Model Binder?

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

【讨论】:

  • 所以,基本上如果我按照您解释的方式实现自定义请求验证器,MVC 本身会抛出“检测到危险字符”异常,就像这些字符是不加掩饰地发送一样?
  • 正确。 RequestValidator 适用于 ASP.net,因此它适用于 Webforms 和 MVC。请注意,尽管 JSON 请求未经过验证,并且控制器默认接受 JSON 请求!
  • 所以除非我以 JSON 请求的形式发布数据并将其保存到数据库中,否则我不应该有任何可以伪装并通过此类验证的 XSS 攻击的风险,对吧?我会尽快测试它,稍后再回来。非常感谢所有的建议!
  • 我刚刚测试了提议的解决方案,它运行良好,尽管我仍然没有测试任何 Json 请求来验证我之前的评论。
  • 是的。表单帖子和查询字符串经过验证,而 JSON 不经过验证。我会更集中精力确保输出被编码而不是验证输入。
猜你喜欢
  • 1970-01-01
  • 2016-06-04
  • 2019-07-12
  • 1970-01-01
  • 2016-04-21
  • 2016-05-16
  • 2016-03-31
  • 2013-12-25
  • 1970-01-01
相关资源
最近更新 更多