在URL中编码JSON时是否存在任何XSS威胁?

时间:2012-07-09 18:33:00

标签: javascript json security xss urlencode

为了拥有一个URL友好的应用程序我正在存储它的上下文在URL中有一个JSON,它提供了类似的东西:

http://mysite.dev/myapppage/target#?context={%22attr1%22%3A{%22target_id-0%22%3A{%22value%22%3A%223%22%2C%22label%22%3A%22Hello%22}}}

编码基本上下文:

{
"attr1":
    {
    "target_id-0":
        {
        "value": "3",
        "label": "Hello"
        }
    }
}

我正在用:

序列化我的对象
JSON.stringify(context)

我用以下方法对其进行反序列化:

var hashParamsElements = window.location.toString().split('?');
hashParamsElements.shift(); // we just skip the first part of the url
var hashParams = $.deparam(hashParamsElements.join('?'));
var contextString = hashParams.context;
var context = JSON.parse(contextString);

上下文仅存储为读取变量,其中没有评估代码。有人能告诉我XSS是否安全吗?

如果存在威胁:我该如何避免?

3 个答案:

答案 0 :(得分:4)

这种威胁来自于使用不同的JSON解码方法,即evalnew Function。它们直接执行JS代码,因此通过将代码放入url(并链接到url)来允许非持久性XSS攻击。

JSON.parse没有此问题,可以安全抵御这类攻击。

See also (json.org).

答案 1 :(得分:2)

label最终是否会在某处插入DOM? (IE,$('#something').html(context.attr1.target_id-0.label)

然后我可以将<script>...</script>放在label中,这就是你的XSS。

答案 2 :(得分:1)

我没有看到任何威胁。它完全安全。 JSON.parse不允许任何function投放。

另外,为什么要使用?。如果你想要一个“真正的”网址,请改用hashbang。