javascript - 为什么Google会在(1)之前提前; 他们的JSON回复?




ajax security (4)

为什么Google会while(1);提前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解析代码。

我已经在其他几个地方看到过这种情况,但谷歌(邮件,日历,通讯录等)的情况更是如此。奇怪的是, 谷歌文档&&&START&&&开头,而谷歌联系人似乎始于while(1); &&&START&&& while(1); &&&START&&&

这里发生了什么?


注意 :自2019年起,导致此问题中讨论的预防措施的许多旧漏洞在现代浏览器中不再是问题。 我将把下面的答案留作历史好奇心,但实际上整个话题自2010年(!!)时就已经发生了根本性的变化。

它可以防止它被用作简单<script>标记的目标。 (好吧,它并没有阻止它,但它让它变得令人不快。)那样坏人不能只将那个脚本标记放在他们自己的网站中,而是依靠一个活动的会话来获取你的内容。

编辑 - 记下评论(和其他答案)。 这个问题与颠覆的内置工具有关,特别是ObjectArray构造函数。 这些可以被修改,以便在解析时无关紧要的JSON可以触发攻击者代码。


它可以防止JSON劫持 ,这是一个主要的JSON安全问题, 自2011年以来在ECMAScript 5中已在所有主流浏览器中正式fixed

举例说明:Google有一个类似mail.google.com/json?action=inbox的网址,它会以JSON格式返回收件箱的前50条消息。 由于同源策略,其他域上的邪恶网站无法通过AJAX请求获取此数据,但它们可以通过<script>标记包含URL。 使用您的 cookie访问URL,通过覆盖全局数组构造函数或访问器方法 ,只要设置了对象(数组或散列)属性,就可以调用该方法,从而允许它们读取JSON内容。

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

这并未解决跨站点请求伪造的问题


由于<script>标签免于同源策略,这是Web环境中的安全必需品, while(1)当添加到JSON响应时,可防止在<script>标记中滥用它。


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





security