【发布时间】:2012-02-22 23:34:36
【问题描述】:
我有 JavaScript 应用程序,我在其中使用客户端模板(underscore.js、Backbone.js)。
初始页面加载的数据被绑定到页面中,如下所示(.cshtml Razor 文件):
<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-like 符号被视为正确的“&lt;”符号。
如何将“&lt;”符号从 DB 转义为 &lt; 和 &gt;(如果它们以某种方式到达那里)?
也许我可以调整Json.Encode 序列化来转义这些符号?
也许我可以设置我正在使用的Entity Framework,以便在从数据库获取数据时始终自动转义这些符号?
【问题讨论】:
-
如果禁用将其解析为 JSON 的
<script>,它是否仍显示警报? -
它仅在通过下划线模板(类 jQuery 模板)插入 DOM 时发出警报。当它只是在 div 中的页面上的第一个时,它不会发出警报。
标签: javascript asp.net-mvc json escaping