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]