Ajax调用响应是什么样的';对于(;);{json data}';什么意思?
可能重复:Ajax调用响应是什么样的';对于(;);{json data}';什么意思?,ajax,json,facebook,Ajax,Json,Facebook,可能重复: 我发现这种语法在Facebook上用于Ajax调用。我对(;)的感到困惑响应开头的部分。它是用来干什么的 这是呼叫和响应: GET http://0.131.channel.facebook.com/x/1476579705/51033089/false/p_1524926084=0 答复: for (;;);{"t":"continue"} 我怀疑它存在的主要原因是控制。它迫使您通过Ajax检索数据,而不是通过JSON-P或类似的方式(它使用script标记,因此将失败,因为
我发现这种语法在Facebook上用于Ajax调用。我对(;)的
感到困惑代码>响应开头的部分。它是用来干什么的
这是呼叫和响应:
GET http://0.131.channel.facebook.com/x/1476579705/51033089/false/p_1524926084=0
答复:
for (;;);{"t":"continue"}
我怀疑它存在的主要原因是控制。它迫使您通过Ajax检索数据,而不是通过JSON-P或类似的方式(它使用script
标记,因此将失败,因为for
循环是无限的),从而确保。这让他们可以控制哪些文档可以向API发出调用—具体来说,只有与该API调用具有相同来源的文档,或者Facebook专门授权通过(在支持CORS的浏览器上)访问的文档。因此,您必须通过浏览器将强制执行SOP的机制请求数据,并且您必须了解该前言,并在反序列化数据之前将其删除
所以是的,它是关于控制(有用的)数据访问的。那么(;;)的
是一个无限循环(如果需要,可以使用Chrome的JavaScript控制台在选项卡中运行该代码,然后观察任务管理器中的CPU使用情况,直到浏览器关闭该选项卡)
因此,我怀疑它可能是为了挫败任何试图使用eval
或任何其他执行返回数据的技术来解析响应的人
为了进一步解释,过去使用JavaScript的eval()
函数解析一点JSON格式的数据非常常见,方法如下:
var parsedJson=eval(“(“+jsonString+”)”)
…这被认为是不安全的,但是,如果由于某种原因,JSON格式的数据包含可执行的JavaScript代码,而不是(或除了)JSON格式的数据,那么该代码将由eval()
执行。这意味着,如果您正在与不受信任的服务器交谈,或者有人破坏了受信任的服务器,那么他们可以在您的页面上运行任意代码
因此,通常不赞成使用eval()
之类的方法来解析JSON格式的数据,而(;;)语句将阻止人们以这种方式解析数据。任何尝试的人都会得到一个无限循环。因此,从本质上讲,这就像Facebook试图强制人们使用其API的方式,而不是让他们容易受到未来试图劫持Facebook API用作载体的攻击。这看起来像是防止CSRF攻击的黑客。有一些特定于浏览器的方法可以连接到对象创建中,因此恶意网站可以先使用这些方法,然后使用以下方法:
<script src="http://0.131.channel.facebook.com/x/1476579705/51033089/false/p_1524926084=0" />
如果在JSON之前没有无限循环,那么就会创建一个对象,因为JSON可以eval()
javascript,钩子会检测它并嗅探对象成员
现在,如果你通过浏览器访问该网站,在登录Facebook时,它可以像获取你的数据一样获取你的数据,然后通过AJAX或javascript帖子等方式将其发送回自己的服务器。我有点晚了,T.J.基本上解决了这个谜,但我想我会分享一篇关于这一特定主题的优秀论文,其中有很好的例子,并提供了对这一机制更深入的见解
这些无限循环是针对“Javascript劫持”的一种对策,这是一种通过对Gmail的攻击而引起公众注意的攻击类型,该攻击由Google发布
这个想法很简单,也很漂亮:很多用户倾向于永久登录Gmail或Facebook。因此,您要做的是设置一个站点,并在恶意站点的Javascript中覆盖对象或数组构造函数:
function Object() {
//Make an Ajax request to your malicious site exposing the object data
}
然后在该站点中包括一个
标记,例如
<script src="http://www.example.com/object.json"></script>
最后,您可以阅读恶意服务器日志中的所有JSON对象
正如承诺的那样,链接到 Facebook有大量的开发人员在内部处理许多项目,犯一个小错误是很常见的;无论是像无法转义插入HTML或SQL模板中的数据这样简单而严重的事情,还是像使用eval
(有时效率低下且可能不安全)或JSON.parse(兼容但并非普遍实现的扩展)而不是“已知良好”的JSON解码器这样复杂而微妙的事情,重要的是,要想办法轻松地在这个开发人员群体中实施最佳实践
为了应对这一挑战,Facebook最近“全力以赴”推出了内部项目,旨在优雅地实施这些最佳实践,老实说,对于这种特定情况,唯一有意义的解释是:有人在内部决定所有JSON解析都应该在其核心库中通过一个实现,而实现这一点的最佳方法是让每个API响应都为(;;)获取代码>自动钉在前面
这样做,开发人员就不能“懒惰”:如果他们使用eval()
,他们会立即注意到,想知道发生了什么,然后意识到自己的错误并使用经批准的JSON API
提供的其他答案似乎都属于以下两类之一:
误解JSONP,或
误解“JSON劫持”
第一类中的攻击者依赖于这样一种想法,即攻击者可以“使用JSONP”向不支持它的API发出请求。JSONP是服务器和客户端都必须支持的协议:它要求服务器返回类似于myFunction({“t”:“continue”})
的内容,以便将结果传递给本地函数。您不能只是偶然地“使用JSONP”
第二类的人正在引用
js> {"t":"continue"}
typein:2: SyntaxError: invalid label:
typein:2: {"t":"continue"}
typein:2: ....^
js> ({"t":"continue"})
[object Object]