【问题标题】:input validation not working on asp.net mvc 4 model sent as JSON输入验证不适用于作为 JSON 发送的 asp.net mvc 4 模型
【发布时间】:2012-12-04 18:00:56
【问题描述】:

我在视图中有一个模型和一个表单。我有一个简单的字符串字段,称为描述。我可以在该字段中插入如下脚本:<script>alert('xss')</script>。 我可以在我网站上的其他操作中看到我看不到的其他模型 我没有AllowHtml 或类似的东西。

唯一的区别是,对于这个模型,我使用了一个带有 json 对象和 application/json 内容类型的帖子 ModelState.IsValid 正在返回 true。即使有一个带有 xss 脚本的描述属性...

对于其他操作,我制作了一个简单的 ajax 帖子。

为什么验证输入不适用于这种 JSON ajax 帖子? 对于这种 ajax 请求,如何防止整个站点出现 xss?

谢谢

【问题讨论】:

  • 我正在经历同样的事情,但还没有解决方案。你有想过这个吗?
  • 试过this?
  • 我知道差异和解决方案。只需在您的问题中提供技术细节。如模型、绑定模型(ViewModel)如果存在的话。每个视图的表单方法,最后是 web.config 文件中的requestValidationMode 版本。如果没有,任何机构都不清楚。

标签: ajax asp.net-mvc jquery


【解决方案1】:

这是因为 ValidateInput 仅适用于 FormValueProvider。至于JsonValueProvider,需要自己推出机制。

步骤 1)创建标记属性CustomAntiXssAttribute 2)通过子类DefaultModelBinder创建自定义模型绑定器 3) 覆盖BindProperty 方法-> 获取底层属性的尝试值,对其进行清理并将其分配给视图模型属性。 签出this

编辑: 将行 var valueResult = bindingContext.ValueProvider.GetValue(propertyDescriptor.Name); 替换为 var valueResult = bindingContext.ValueProvider.GetValue((string.IsNullOrWhiteSpace(bindingContext.ModelName) ? string.Empty : bindingContext.ModelName + ".") + propertyDescriptor.Name); 以支持嵌套 ViewModel。

【讨论】:

    【解决方案2】:

    尝试使用来自 Nuget 的 AntiXssLibrary,并使用 getSafeHtmlContent。您可以在将记录保存到 db 时获取安全内容。

    【讨论】:

      【解决方案3】:

      另一种方法是使用像this one 这样的 Sanitizer 库,您可以选择要过滤掉的 HTML 标记。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-20
        • 2013-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-27
        • 1970-01-01
        相关资源
        最近更新 更多