15

我注意到一些 json 查询,特别是在 google 服务中,返回一个特殊的“json”,它以一个结束序列开头,然后它只有一个数组结构,用方括号指定。

这是一个什么样的ajax?是否有一些库,js或py,解析它?

举一个更具体的例子:

>>> import json
>>> import urllib2
>>> url=urllib2.urlopen("https://plus.google.com/u/0/_/socialgraph/lookup/visible/?o=%5Bnull%2Cnull%2C%22114423404493486623226%22%5D")
>>> url.readline()
")]}'\n"
>>> url.readline()
'\n'
>>> url.readline()
'[["tsg.lac",[]\n'

从那里,一个典型的数组随之而来。因此,完整的答案是一个两行“标题”,然后是一个数组,但是“标题”非常令人费解,我想知道它是来自标准的 ajax 库还是只是这些人的想法。

啊,如果您使用 Chrome 的开发人员工具查看实际查询,您会看到相同的结果。所以我被诱导相信这是一个实际的答案,而不是查询的产物。

4

1 回答 1

20

在消息的开头使用无效的 JSON 是击败 CSRF 和对 JavaScript 数组构造函数的棘手攻击的一种方法。

如果该 URL 返回一个有效的、未包装的数组,那么您访问的任何站点都可以重载 Array 函数,在页面上放置/注入对该 Google+ URL 的脚本引用,并在您加载其页面时获取您的私有/安全数据。

谷歌自己的客户端代码可以在解析之前去除无效的 JSON,因为它使用的是传统的 XHR 请求,可以让他们访问原始响应。远程站点只能通过脚本元素注入来访问它,并且没有机会在浏览器解析数据之前对其进行预处理。后者类似于 JSONP 的工作方式,Array 构造函数在不知不觉中变成了回调函数。

您将在许多返回 JSON 数组以响应 GET 请求的知名网站上看到类似的方法。例如, Facebook 用for (;;);. 如果您尝试对这些 Facebook API 使用 CSRF 攻击,浏览器只会在引用 Facebook 私有 API 的远程站点上进入无限循环。在 Facebook.com 上,他们的客户端代码有机会在运行 JSON.parse() 之前将其剥离。

于 2011-07-04T19:27:16.120 回答