Json.encode特殊符号\ u003c MVC3

时间:2012-02-22 23:34:36

标签: javascript asp.net-mvc json escaping

我有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">{&quot;Title&quot;:&quot;\u003cscript\u003ealert(\u0027XSS\u0027)\u003c/script\u003e&quot;}</div>

在“解析”操作之后:

var data = JSON.parse($("#model").html());

我们的"Title"字段的对象数据正好是"<script>alert('XSS');</script>"

如果这是下划线模板,它会发出警报。

不知何故\u003c-个符号被视为正确的“<”符号。

如何将“<”符号从DB迁移到&lt;&gt;(如果他们以某种方式到达那里)?

也许我可以调整Json.Encode序列化以逃避这些符号? 也许我可以设置我正在使用的Entity Framework,以便在从数据库获取数据时始终自动地转义这些符号?

3 个答案:

答案 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>

然后打开警报。

相关问题