【问题标题】:Best way to prevent XSS hacking with (embedded)user generated json?使用(嵌入式)用户生成的 json 防止 XSS 黑客攻击的最佳方法?
【发布时间】:2015-09-18 17:09:34
【问题描述】:

参见即:http://jsfiddle.net/agv9ya39/

var json = { name: "</script><script>alert(123);</script>" };

请注意,我确实想在页面中嵌入json(数据与页面密切相关,无法缓存,我不想做额外的请求)

一种解决方案是在输出之前对整个 json 字符串执行 String.Replace("&lt;/script&gt;)。但这感觉很老套,而且我可能遗漏了其他易受 XSS 攻击的案例。

当然,我也可以确保它永远不会像这样在数据库中结束,但我宁愿有一个额外的保护,以防万一有东西滑入。

我正在使用 C# 和 Json.Net。

【问题讨论】:

    标签: c# json json.net xss


    【解决方案1】:

    您可以将 &lt;!--&lt;/script&gt; 替换为 &lt;\!--&lt;\/script&gt; 以涵盖 JSON 的所有 &lt;script&gt; 突破。不过,请考虑将 JSON 放入 data-* 属性中,然后使用 JSON.parse 读取它。

    <div id="some-relevant-element"
         data-json="{&quot;name&quot;:&quot;</script><script>alert(123);</script>&quot;}">
       …
    </div>
    
    <script>
    var someRelevantElement = document.getElementById('some-relevant-element');
    var json = JSON.parse(someRelevantElement.getAttribute('data-json'));
    </script>
    

    【讨论】:

    • 注意,当你把它放在data-属性中时,你必须HTML-attribute-escape它。
    • 我很确定,如果您在脚本标签内,转义 / 就足够了(因为唯一有问题的字符串是 &lt;/string&gt;
    • 嗨@minitech,不错的解决方案。不过,我会有点担心数据属性的长度。我实际上是从 json 读取页面中的所有数据 - 如果那里有一些大文本..
    • 嗨@minitech,我实际上注意到 实际上是在客户端自动转换的:你知道我在哪里可以找到有关这种转义类型的更多信息吗?
    • @ThiefMaster:不,有一个不太可能但仍然可能的漏洞利用,&lt;!--&lt;script&gt; 序列将导致合法的&lt;/script&gt; 被视为脚本的一部分。我会在某个时候找到一个例子。
    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2018-07-16
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多