众所周知,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}还有其他响应,其中{..}
有无限循环!
:
也在这里(对象,具有无限循环)
答案 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)。