Facebook突然可以防止JSON劫持吗?

时间:2019-03-17 11:00:50

标签: javascript json facebook security cross-domain

众所周知,Facebook uses javascript responses(JS,不是json)的前缀为while(1)for(;;);,目的是防止在旧浏览器为{时,脚本标记窃取json数据。 {3}}

但是从最近的尝试来看,似乎不再是这种情况了(对于朋友列表,我确定它已经被使用了)

being overloaded with their Array ctor & Object ctor.

请注意,现在的内容类型为:

content-type: application/octet-stream

但是他们为什么这样做?现在安全吗? (我知道它适用于较旧的浏览器,但仍然...)。

我知道[..]的问题是有问题的。但是{..}的ctor呢?

问题:

Facebook为什么要删除无限循环?以及他们现在如何缓解json劫持?

我的意思是,如果<script>标签将尝试获取“ getFiriends”列表,那该怎么办? (在旧版浏览器中)

NB

值得一提的是,还有{em> {em}还有其他响应,其中{..}有无限循环! :

enter image description here

也在这里(对象,具有无限循环)

enter image description here

1 个答案:

答案 0 :(得分:2)

此攻击(将JSON作为<script>加载)基于以下一些假设:

1)JSON本身就是有效的JS(这就是for(;;)的变化),这也意味着它可能不能以{开头,因为它是一个不包含键的块语句-值对:

 { "a": 1 } // invalid JS, valid JSON *
 [{ "a": 1 }] // valid JS, valid JSON

2)浏览器非常老(< 1% of the total users),因为用文字构造数组不会在较新的浏览器中调用Array函数(ES5支持是对这些浏览器的一个很好的估计)。

因此,在这种情况下不可能进行这种攻击,因为您提到的API返回了一个对象,因此(1)未满。即使API返回一个数组,理论上也只有极少数人被劫持:

1)浏览器必须非常老,然后浏览器本身可能会有更大的风险,并且浏览器甚至必须支持JavaScript。

2)客户必须访问一个恶意站点,由于各个级别的垃圾邮件过滤器/黑名单,这种可能性很小。

3)用户访问恶意网站时必须登录Facebook。

  

值得一提的是,还有其他一些带有无限循环的响应

我想这通常已经成为过去。直到重构/迁移所有API都需要一段时间。如果您以Facebook的规模考虑,我假设添加/删除这5个字符会导致大量开销。


*:如果尝试加载{ a: 1 },您会发现它不会引发SyntaxError!但是,这既不是有效的JSON,也不会创建对象(在blocn语句中标记为1)。