为什么谷歌会在(1);他们的(私有)JSON响应?

例如,在Google calendar中打开和关闭日历时有一个响应:

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

我认为这是为了防止人们对它进行求值(),但你真正需要做的就是替换while,然后就可以设置了。我假设eval预防是为了确保人们编写安全的JSON解析代码。

我也在其他几个地方看到过这种用法,但在谷歌(邮件、日历、联系人等)中更是如此。奇怪的是,谷歌文档以&&&START&&开头,而谷歌联系人似乎以while开头(1)&&&开始&&&。

这是怎么回事?


当前回答

注意:截至2019年,导致本问题中讨论的预防措施的许多旧漏洞在现代浏览器中不再是问题。我会把下面的答案作为一个历史性的好奇,但事实上,自2010年(!!)被问及这个问题以来,整个话题已经发生了根本性的变化。


它防止它被用作简单<script>标记的目标。(好吧,这并不能阻止它,但它会让它变得不愉快。)这样,坏人就不能只将脚本标签放在自己的网站上,并依靠活动会话来获取你的内容。

编辑-记录评论(和其他答案)。问题与被破坏的内置设施有关,特别是Object和Array构造函数。可以对这些进行修改,以便在解析无害的JSON时触发攻击者代码。

其他回答

这是为了确保某些其他网站不会使用卑鄙的手段来窃取您的数据。例如,通过替换数组构造函数,然后通过<script>标记包含此JSON URL,恶意第三方站点可以从JSON响应中窃取数据。通过放置一段时间(1);在开始时,脚本将挂起。

另一方面,使用XHR和单独的JSON解析器的同一站点请求可以很容易地忽略while(1);前缀

由于<script>标记不受同源策略的约束,这是web世界中的一个安全必要条件,而(1)当添加到JSON响应时,可以防止在<script>标签中误用它。

这将使第三方很难将JSON响应插入带有<script>标记的HTML文档中。请记住,<script>标记不受同源策略的约束。

注意:截至2019年,导致本问题中讨论的预防措施的许多旧漏洞在现代浏览器中不再是问题。我会把下面的答案作为一个历史性的好奇,但事实上,自2010年(!!)被问及这个问题以来,整个话题已经发生了根本性的变化。


它防止它被用作简单<script>标记的目标。(好吧,这并不能阻止它,但它会让它变得不愉快。)这样,坏人就不能只将脚本标签放在自己的网站上,并依靠活动会话来获取你的内容。

编辑-记录评论(和其他答案)。问题与被破坏的内置设施有关,特别是Object和Array构造函数。可以对这些进行修改,以便在解析无害的JSON时触发攻击者代码。

它防止了JSON劫持,这是一个主要的JSON安全问题,自2011年以来,所有主要浏览器都通过ECMAScript 5正式解决了这个问题。

有争议的例子:假设谷歌有一个类似mail.Google.com/json的URL?action=inbox,以JSON格式返回收件箱的前50条消息。由于同源策略,其他域上的恶意网站无法发出AJAX请求来获取这些数据,但它们可以通过<script>标签包含URL。通过cookie访问URL,并且通过重写全局数组构造函数或访问器方法,每当设置对象(数组或哈希)属性时,都可以调用一个方法,从而允许它们读取JSON内容。

while(1);或者&&&BLAH&&&阻止了这一点:mail.google.com上的AJAX请求将完全访问文本内容,并可以将其删除。但是<script>标记插入会盲目地执行JavaScript而不进行任何处理,从而导致无限循环或语法错误。

这并不能解决跨站点请求伪造的问题。