输入验证不适用于以 JSON 形式发送 asp.net mvc 4 模型

input validation not working on asp.net mvc 4 model sent as JSON

提问人:guy schaller 提问时间:12/18/2012 最后编辑:marzzyguy schaller 更新时间:6/7/2021 访问量:1267

问:

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

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

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

为什么验证输入不适用于这种 JSON ajax 帖子? 如何防止整个站点的 XSS 出现此类 AJAX 请求?

谢谢

ajax asp.net-mvc jquery

评论

1赞 kingdango 3/13/2014
我正在经历完全相同的事情,但还没有解决方案。你有没有想过这一点?
0赞 BenG 10/22/2018
过这个?
1赞 Amirhossein Mehrvarzi 10/24/2018
我知道差异和解决方案。只需在您的问题中提供技术细节即可。例如 Model、Binding Model (ViewModel)(如果存在)。表单方法,最后是 web.config 文件中的版本。如果没有,则不清楚为任何机构回答。requestValidationMode

答:

0赞 Thurein 3/15/2014 #1

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

步骤 1) 创建标记属性 2) 通过子类化创建自定义模型绑定器 3) 覆盖方法 ->获取基础属性的尝试值,对其进行清理并将其分配给视图模型属性。 看看这个CustomAntiXssAttributeDefaultModelBinderBindProperty

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

0赞 Saadi 11/5/2018 #2

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

0赞 GMihalkov 12/5/2019 #3

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