Facebook 突然可以安全地防止 JSON 劫持了吗?

Is facebook suddenly safe against JSON hijacking?

众所周知Facebook uses javascript responses (JS,not json) which is prefixes with while(1) & for(;;); in order to prevent script tag to steal the json data when old browsers are being overloaded with their Array ctor & Object ctor.

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

注意现在,内容类型是:

content-type: application/octet-stream

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

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

问题:

为什么 facebook 删除了无限循环?他们现在如何缓解 json 劫持?

我的意思是,如果 <script> 标记尝试获取 "getFiriends " 列表,现在会发生什么情况? (在非常旧的浏览器中)

注意事项

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

也在这里( Object ,无限循环)

此攻击(加载 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 你提到的 return 是一个对象,因此 (1) 没有被填满。而且即使 API 会 return 一个数组,理论上也只有极少数人可以被劫持:

1) 浏览器必须很老,然后浏览器本身可能是一个更大的风险,浏览器甚至必须支持 JavaScript.

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

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

Worth to mention that there are still others responses with infinite loop

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


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