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)。
众所周知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)。