为什么 JSON 劫持攻击在现代浏览器中不起作用?它是如何修复的?

信息安全 json 网络
2021-08-23 00:10:47

我知道 JSON 劫持漏洞已在所有现代浏览器中得到修复,但究竟如何?

有很多文章讨论了防止 JSON 劫持攻击的技术(即while(1);像 Google 那样预先设置),但没有人解释它们现在是否仍需要在 Web 应用程序中实现(显然假设用户不会使用该应用程序非常旧的浏览器)。

现在是否应该将 JSON 数据作为数组文字返回被视为安全风险?

1个回答

导致 google 预先考虑的 JSON 问题是while早期版本的 firefox(特别是 1.5 和 2b)中的同源故障,其中 JSON 文件可以作为普通脚本标签从场外加载,并且可以访问其数据。

通常,如果作为脚本加载,JSON 文件不会“告诉”JS 引擎执行任何操作,因此它们没有/不保留对其数据结构的引用。JS 的安全性是基于引用的,所以这个假设很好。JSON 对象字面量 ( {}) 实际上是 JS 引擎的歧义,因为它们看起来像代码大括号,从而导致语法错误。旧 FF 的问题在于,人们可能会使用晦涩的运行时修改,导致数组文字在解析/创建时执行一些其他代码。其他代码可以自省地到达数组的内容,这是一个错误。

XML 存在相关问题,因为 firefox 认为某些 XML 形状是使用 FF 的 E4X 扩展 (Ecmascript4XML) 的有效 JavaScript(tm)。IE 在将非 js 内容作为脚本加载时存在一些问题,会出错,但会将内容显示给预先应用的全局错误处理程序,该处理程序会报告导致问题的“代码”的来源。

由于现在有可行的安全方法来获取远程 JSON 内容,过时的浏览器和 JSONp/漏洞利用的eval()漏洞不再适用于加载内容。如果您尝试将有效的 JSON 资源作为脚本加载,则无法从其他 JS 访问内容。

最后,我认为这实际上与安全性没有太大关系。php、curl、python 等不关心浏览器的规则;如果数据在那里,它就在那里。同源策略在这方面所做的唯一一件事就是防止“深度链接”资源窃取非机密数据。