javascript – 为什么Google会在(1); 到他们的JSON响应?

为什么Google会预先while(1);安排他们的(私人)JSON响应?

例如,以下是Google日历中打开和关闭日历时的响应:

while(1);[['u',[['smsSentFlag','false'],['hideInvitations','false'],
  ['remindOnRespondedEventsOnly','true'],
  ['hideInvitations_remindOnRespondedEventsOnly','false_true'],
  ['Calendar ID stripped for privacy','false'],['smsVerifiedFlag','true']]]]

我会认为这是为了防止人们对此进行干预eval(),但是您真正需要做的就是替换while并设置。我会假设eval预防是确保人们编写安全的JSON解析代码。

我也看到过这种情况在其他几个地方也有使用,但Google(邮件,日历,联系人等)的情况更是如此。奇怪的是,Google Docs开头&&&START&&&,Google Contacts似乎开始while(1); &&&START&&&

这里发生了什么?


它可以防止JSON劫持

有争议的例子:假设Google有一个URL mail.google.com/json?action=inbox,它以JSON格式返回收件箱中的前50条消息。由于同源策略,其他域上的恶意网站无法发出AJAX请求来获取此数据,但它们可以通过<script>标记包含该网址。该URL访问了你的饼干,并通过覆盖全球的数组构造或访问方法,他们可以有一个当一个对象(数组或哈希)属性设置调用的方法,使他们能够读取JSON内容。

while(1);&&&BLAH&&&防止这样的:在一个AJAX请求mail.google.com将具有完全访问的文本内容,并且可以去除它扔掉。但是<script>标签插入盲目地执行JavaScript而没有任何处理,导致无限循环或语法错误。

这并没有解决跨站请求伪造的问题


它防止通过JSON劫持泄露响应。

理论上,HTTP响应的内容受同源策略保护:来自一个域的页面不能从其他域上的页面获取任何信息(除非明确允许)。

攻击者可以以您的名义请求其他域上的页面,例如通过使用<script src=...><img>标记,但无法获取有关结果(标题,内容)的任何信息。

因此,如果您访问攻击者的页面,则无法从gmail.com读取您的电子邮件。

除了在使用脚本标记请求JSON内容时,JSON在攻击者的受控环境中以Javascript执行。如果攻击者可以替换Array或Object构造函数或对象构造过程中使用的其他方法,那么JSON中的任何内容都将通过攻击者的代码并被泄露。

请注意,这发生在JSON作为Javascript执行时,而不是在它被解析时。

有多种对策措施:

确保JSON永不执行

通过while(1);在JSON数据之前放置语句,Google可以确保JSON数据永远不会以Javascript的形式执行。

只有合法的页面才能真正获得整个内容,剥离while(1);并将其余部分解析为JSON。

比如for(;;);在Facebook上就已经看到类似的结果。

确保JSON无效Javascript

类似地,在JSON之前添加无效令牌&&&START&&&,确保它永远不会被执行。

始终使用外部对象返回JSON

这是防止发生JSON劫持的OWASP推荐方法,也是较不具侵入性的方法。

与之前的对策类似,它确保JSON永远不会以Javascript的形式执行。

有效的JSON对象在没有被任何东西包围时,在Javascript中无效:

eval('{"foo":"bar"}')
// SyntaxError: Unexpected token :

然而,这是有效的JSON:

JSON.parse('{"foo":"bar"}')
// Object {foo: "bar"}

因此,确保始终返回响应顶级的对象,确保JSON不是有效的Javascript,同时仍然是有效的JSON。

正如注释中的@hvd所指出的,空对象{}是有效的Javascript,并且知道该对象是空的,本身可能是有价值的信息。

以上方法的比较

OWASP方式不那么干扰,因为它不需要客户端库更改,并传输有效的JSON。但是,不确定过去或未来的浏览器错误是否会打败。正如@oriadam所指出的那样,通过错误处理(如window.onerror),数据是否可能在解析错误中泄漏尚不清楚。

谷歌的方式需要客户端库以支持自动反序列化,并且可以被认为对浏览器错误更安全。

这两种方法都需要进行服务器端更改,以避免开发人员意外发送易受攻击的JSON。

添加评论

友情链接:蝴蝶教程