为什么Google会优先使用while(1); 他们的JSON响应?

JavaScript

神奇西里泡芙

2020-03-09

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,然后进行设置。我认为评估的目的是确保人们编写安全的JSON解析代码。

我也曾在其他几个地方使用过此功能,但在Google(邮件,日历,通讯录等)中使用了更多功能。奇怪的是,Google Docs以开头,&&&START&&&而Google Contacts似乎以开头while(1); &&&START&&&

这里发生了什么?

第151篇《为什么Google会优先使用while(1); 他们的JSON响应?》来自Winter(https://github.com/aiyld/aiyld.github.io)的站点

6个回答
米亚小哥斯丁 2020.03.09

身份验证到位后,JSON劫持保护可以采取多种形式。Google将while(1)附加到其JSON数据中,因此,如果有任何恶意脚本对其进行评估,则该恶意脚本会进入无限循环。

参考:Web安全测试手册:快速发现问题的系统技术

前端Tom 2020.03.09

注意:从2019年开始,导致该问题中讨论的预防措施的许多旧漏洞不再是现代浏览器中的问题。我将以下答案保留为历史性的好奇心,但实际上自2010年问起以来,整个主题已经发生了根本变化(!!)。


它防止将其用作简单<script>标签的目标(好吧,这并不能阻止它,但是它使它不愉快。)那样,坏蛋就不能只将脚本标记放在自己的站点中,而是依靠活动会话来获取内容。

编辑 -注意评论(和其他答案)。这个问题与颠覆的内置功能有关,特别是ObjectArray构造函数。可以对其进行更改,以使否则当解析时使用无害的JSON可能会触发攻击者代码。

米亚小小神乐 2020.03.09

这将使第三方很难将带有<script>标记的JSON响应插入到HTML文档中请记住,该<script>标签不受“ 相同来源政策”的约束

null 2020.03.09

它可以防止JSON劫持,这是自2011年以来使用ECMAScript 5 在所有主要浏览器中正式修复的主要JSON安全问题

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

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

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

Sam神乐番长 2020.03.09

由于该<script>标记不受Web世界中安全性必需的Same Origin Policy的限制,因此将其while(1)添加到JSON响应后,可以防止在<script>标记中滥用该标记。

JinJinPro 2020.03.09

这是为了确保其他某些网站无法采取令人讨厌的手段来窃取您的数据。例如,通过替换数组构造函数,然后通过<script>标签包含此JSON URL ,恶意的第三方站点可能会从JSON响应中窃取数据。通过将a while(1);放在开头,脚​​本将挂起。

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

问题类别

JavaScript Ckeditor Python Webpack TypeScript Vue.js React.js ExpressJS KoaJS CSS Node.js HTML Django 单元测试 PHP Asp.net jQuery Bootstrap IOS Android