我有JavaScript应用程序,我使用客户端模板(underscore.js,Backbone.js)。
初始页面加载的数据被绑在页面中(.cshtml Razor-file):
<div id="model">@Json.Encode(Model)</div>
Razor引擎执行转义,因此,如果Model
是
new { Title = "<script>alert('XSS');</script>" }
,在输出中我们有:
<div id="model">{"Title":"\u003cscript\u003ealert(\u0027XSS\u0027)\u003c/script\u003e"}</div>
在“解析”操作之后:
var data = JSON.parse($("#model").html());
我们的"Title"
字段的对象数据正好是"<script>alert('XSS');</script>"
!
如果这是下划线模板,它会发出警报。
不知何故\u003c-
个符号被视为正确的“<
”符号。
如何将“<
”符号从DB迁移到<
和>
(如果他们以某种方式到达那里)?
也许我可以调整Json.Encode
序列化以逃避这些符号?
也许我可以设置我正在使用的Entity Framework
,以便在从数据库获取数据时始终自动地转义这些符号?
答案 0 :(得分:2)
\ u003c和类似的代码对JS完全有效。如果您愿意,可以使用此语法对整个JS文件进行模糊处理。基本上,你看到一个转义字符\,u表示unicode,然后是一个4字符的十六进制代码,它与符号有关。
http://javascript.about.com/library/blunicode.htm
\ u003c - 如你所知,是&lt;字符。
在MVC端“修复”这种方法的一种方法是编写一个查找模式\ _的RegEx,然后捕获接下来的4个字符。然后,您可以将它们解码为实际的unicode字符 - 并通过XSS预防算法运行生成的文本。
正如您在问题中所指出的那样 - 只是寻找“&lt;”没有帮助。您也不能仅仅寻找“\ u003cscript” - 因为这假设潜在的黑客不仅仅是对整个“脚本”标记字进行unicode编码。更安全的方法是取消所有这些类型的代码,然后以纯文本格式清理HTML。
顺便说一句,它可能会让您感觉更好,因为这是XSS预防中常见的(因此很难解决)问题之一。所以你并不是唯一一个想要更好的解决方案......
您可以查看以下库以帮助进行实际的html清理:
http://wpl.codeplex.com/(微软尝试解决方案 - 虽然用户反馈非常糟糕) https://www.owasp.org/index.php/Category:OWASP_AntiSamy_Project_.NET(一个旨在进行大量此类预防的私人项目。我觉得很难使用,而且在.NET中实现很差)
但两者都是很好的参考。
答案 1 :(得分:1)
在将字符串提供给Underscore之前,您需要将其编码为HTML。
"HTML escaping in Underscore.js templates"解释了如何执行此操作。
答案 2 :(得分:0)
如果您想编写未编码的内容,则需要使用Html.Raw()帮助程序:
@Html.Raw(Json.Encode(Model))
编辑:
我猜,也许我不明白你的问题是什么。例如,在测试控制器中,我有以下
ViewBag.Test = new { Title = "<script>alert('XSS');</script>" };
在相关视图中:
<script type="text/javascript">
var test = @Html.Raw(Json.Encode(ViewBag.Test));
console.log(test.Title);
document.write(test.Title);
</script>
然后输出到控制台:
<script>alert('XSS');</script>
然后打开警报。