避免JSON劫持中" )]}',\n "和"{} &&"的区别

11

在阅读有关如何避免JSON劫持的相关内容时,我发现了各种方法,包括POST一切或在响应之前加入一些内容,使它们不是有效的JavaScript。

最常见的预置方法似乎是在对象或数组前面添加{} &&Angular建议使用)]}',\n进行前置。

为什么angular不使用更标准的{} &&方法?其中一个不完全安全吗?在JavaScript中使用哪个更困难?除了Angular之外,采取不那么流行的方法是否有充分的理由?


将JSON作为{}集合本身发送,只要您有多个键,它就不是有效的JS程序。我不知道为什么采取哪种方法很重要,只要它不作为脚本执行即可。开头可以是任何无效代码。这方面不需要一致性。 - cookie monster
4
不存在所谓的JSON劫持。Firefox 3有一种利用Array构造函数的方法,但那是很久以前的事情了。没有充分的理由不提供纯JSON服务。此外,任何具有PHP脚本的人都可以捕获所有内容,您仅需要保护防止僵尸JS客户端,而它们不再需要此类保护。由于旧版IE没问题,新东西也没问题,现在很少有这种劫持的攻击向量存在。 - dandavis
2
@dandavis是正确的。这在非常非常旧的浏览器中存在问题。显然,即使IE6也免疫于此攻击。但是关于你的问题,你基本上在问是扔扳手进齿轮还是撬棍更好。这并不重要。 - cookie monster
@dandavis:只需链接到现代浏览器中是否仍存在JSON劫持问题? :-) - Bergi
更简单和更重要的一点是,无论是哪种方式,都不要未经加密和未经授权地提供敏感信息。 - dandavis
2
@dandavis 顺便说一下,如果资源没有进行身份验证保护,那么像你提到的那样,有人可以使用 PHP 脚本获取数据,但我们正在讨论的漏洞利用了客户端的身份验证作为策略的一部分,因此对用户进行身份验证并不能避免问题。我可能错了,但我认为加密也会因同样的原因而失败。 - Planky
1个回答

2

任何阻止JSON响应被解析为JavaScript对象或数组的内容都将防止JSON劫持的这种方法。

请参见此帖子了解一些使您的JSON安全的方法

然而,正如这个答案所述,自Firefox 3以来就不再是问题。

谷歌使用一个“无法解释的[cruft]”来防御这种类型的攻击。值得注意的是,这个漏洞已经在Firefox 3中修复,并且这个漏洞产生于浏览器实现JSON规范的方式。

在撰写本文时,谷歌似乎在其Gmail响应中添加了)]}'


值得保护的问题,每10,000个请求到维基媒体页面中,有3个被识别为来自Firefox 2浏览器,其他过时浏览器的数据也类似。请参阅2014年1月1日至31日的维基媒体流量分析报告 - Planky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接