【问题标题】:Json.encode special symbols \u003c MVC3Json.encode 特殊符号 \u003c MVC3
【发布时间】: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">{&quot;Title&quot;:&quot;\u003cscript\u003ealert(\u0027XSS\u0027)\u003c/script\u003e&quot;}</div>

在“解析”操作之后:

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

我们有带有"Title" 字段的对象数据正好是"&lt;script&gt;alert('XSS');&lt;/script&gt;"

当它转到下划线模板时,它会发出警报。

不知何故,\u003c-like 符号被视为正确的“&amp;lt;”符号。

如何将“&amp;lt;”符号从 DB 转义为 &amp;lt;&amp;gt;(如果它们以某种方式到达那里)?

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

【问题讨论】:

  • 如果禁用将其解析为 JSON 的 &lt;script&gt;,它是否仍显示警报?
  • 它仅在通过下划线模板(类 jQuery 模板)插入 DOM 时发出警报。当它只是在 div 中的页面上的第一个时,它不会发出警报。

标签: javascript asp.net-mvc json escaping


【解决方案1】:

\u003c 和类似的代码对 JS 完全有效。如果您愿意,可以使用此语法混淆整个 JS 文件。本质上,您看到的是转义字符 \,u 表示 unicode,然后是与符号相关的 4 字符十六进制代码。

http://javascript.about.com/library/blunicode.htm

\u003c - 正如您所指出的,是

在 MVC 端“修复”此问题的一种方法是编写一个 RegEx,它查找模式 \u - 然后捕获接下来的 4 个字符。然后,您可以将它们解编码为实际的 unicode 字符 - 并通过您的 XSS 预防算法运行生成的文本。

正如您在问题中所指出的 - 只是寻找“

顺便说一句,注意这是 XSS 预防中的常见问题之一(迄今为止解决得不好),这可能会让您感觉更好。所以你不是唯一一个想要更好的解决方案的人......

您可以查看以下库来帮助进行实际的 html 清理:

http://wpl.codeplex.com/(微软尝试解决方案 - 尽管用户反馈非常糟糕) https://www.owasp.org/index.php/Category:OWASP_AntiSamy_Project_.NET(一个私人项目,旨在做很多这种预防。我觉得很难使用,在.NET中实现很差)

不过,两者都是很好的参考。

【讨论】:

    【解决方案2】:

    在将字符串提供给 Underscore 之前,您需要将其编码为 HTML。

    "HTML escaping in Underscore.js templates" 解释了如何做到这一点。

    【讨论】:

    • 感谢您的回答,这是其中一种方式。但它需要记住在每个模板中的客户端上每次都使用它。我正在寻找某种方法在服务器上执行此操作,也许以某种方式配置序列化(@Json.Encode(Model))
    【解决方案3】:

    如果您想编写未编码的内容,您需要使用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>
    

    并打开警报。

    【讨论】:

    • 不,实际上我确实想编写编码内容。我想对 DB 中的“
    • 仍有 \u003c 符号在 JS 中被视为正确的“
    • @Roman,也许我不明白您的问题,因为警报在我刚刚运行的测试中正常工作?
    • 是的,它会发出警报,我不希望它发出警报。我想阻止标题文本属性中的脚本运行,因为它是从客户端到数据库,然后从数据库到视图。
    猜你喜欢
    • 1970-01-01
    • 2013-03-21
    • 2012-11-12
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多