4

为了有一个 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 安全的吗?

如果有威胁:我该如何避免它?

4

3 回答 3

4

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

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

另见 (json.org)。

于 2012-07-09T21:36:54.590 回答
2

label最终会被插入到某个 DOM 中吗?(即,$('#something').html(context.attr1.target_id-0.label)

然后我可以输入<script>...</script>一个label,这就是你的 XSS。

于 2012-07-09T21:48:44.407 回答
1

我看不出有任何威胁。它完全安全。JSON.parse不允许任何function运行。

另外,为什么要使用?. 如果您想给人一种“真实”网址的感觉,请改用 hashbang。

于 2012-07-09T21:38:48.817 回答