Rom*_*man 8 javascript asp.net-mvc json escaping
我有JavaScript应用程序,我使用客户端模板(underscore.js,Backbone.js).
初始页面加载的数据被绑定到页面中(.cshtml Razor-file):
<div id="model">@Json.Encode(Model)</div>
Run Code Online (Sandbox Code Playgroud)
Razor引擎执行转义,如果Model
是的话
new { Title = "<script>alert('XSS');</script>" }
Run Code Online (Sandbox Code Playgroud)
,在输出中我们有:
<div id="model">{"Title":"\u003cscript\u003ealert(\u0027XSS\u0027)\u003c/script\u003e"}</div>
Run Code Online (Sandbox Code Playgroud)
其中"解析"后的操作:
var data = JSON.parse($("#model").html());
Run Code Online (Sandbox Code Playgroud)
我们有完整的"Title"
字段对象数据"<script>alert('XSS');</script>"
!
当这转到下划线模板时,它会发出警报.
不知何故,\u003c-
像符号被视为正确的" <
"符号.
我如何逃脱" <
"符号<
,并>
从数据库(如果他们莫名其妙地到了那里)?
也许我可以调整Json.Encode
序列化以逃避这些符号?也许我可以设置Entity Framework
我正在使用的,以便在从DB获取数据时始终自动地逃避这些符号?
\u003c 和类似的代码对于 JS 来说是完全有效的。如果您愿意,您可以使用此语法混淆整个 JS 文件。本质上,您看到的是转义字符 \、u 表示 unicode,然后是与符号相关的 4 字符十六进制代码。
http://javascript.about.com/library/blunicode.htm
\u003c - 正如您所注意到的,是 < 字符。
在 MVC 端“修复”此问题的一种方法是编写一个 RegEx 来查找模式 \u - 然后捕获接下来的 4 个字符。然后,您可以将它们取消编码为实际的 unicode 字符 - 并通过 XSS 预防算法运行生成的文本。
正如您在问题中所指出的 - 仅仅寻找“<”并没有帮助。您也不能只查找“\u003cscript” - 因为这假设潜在的黑客并没有简单地对整个“script”标签词进行 unicode 编码。更安全的方法是取消转义所有这些类型的代码,然后以纯文本形式清理 HTML。
顺便说一句,注意到这是 XSS 预防中常见的(迄今为止尚未解决的)问题之一,可能会让您感觉更好。所以你并不是唯一一个想要更好的解决方案的人......
您可以查看以下库来帮助实际的 html 清理:
http://wpl.codeplex.com/(微软尝试解决方案 - 尽管用户反馈非常糟糕) https://www.owasp.org/index.php/Category:OWASP_AntiSamy_Project_.NET(一个私人项目,旨在做了很多这样的预防。我发现它很难使用,并且在 .NET 中实现得很差)
不过,两者都是很好的参考。
归档时间: |
|
查看次数: |
7867 次 |
最近记录: |