为了拥有一个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是否安全吗?
如果存在威胁:我该如何避免?
答案 0 :(得分:4)
这种威胁来自于使用不同的JSON解码方法,即eval
和new Function
。它们直接执行JS代码,因此通过将代码放入url(并链接到url)来允许非持久性XSS攻击。
JSON.parse
没有此问题,可以安全抵御这类攻击。
答案 1 :(得分:2)
label
最终是否会在某处插入DOM? (IE,$('#something').html(context.attr1.target_id-0.label)
)
然后我可以将<script>...</script>
放在label
中,这就是你的XSS。
答案 2 :(得分:1)
我没有看到任何威胁。它完全安全。 JSON.parse
不允许任何function
投放。
另外,为什么要使用?
。如果你想要一个“真正的”网址,请改用hashbang。