为什么谷歌在他们的(私人)JSON响应中预置了while(1);
?
例如,这里是在谷歌日历中打开和关闭日历时的一个响应。
while(1);[['u',[['smsSentFlag','false'],['hideInvitations','false'],
['remindOnRespondedEventsOnly','true'],
['hideInvitations_remindOnRespondedEventsOnly','false_true'],
['Calendar ID stripped for privacy','false'],['smsVerifiedFlag','true']]]]
我认为这是为了防止人们对其进行 "eval()",但你只需替换 "while",就可以了。我认为防止评估是为了确保人们编写安全的JSON解析代码。
我在其他一些地方也看到过这种做法,但在谷歌(邮件、日历、联系人等)中更多。奇怪的是,谷歌文档以&&&START&&
代替,而谷歌联系人似乎以while(1);&&START&&
开始。
这里发生了什么?
注意:截至2019年,许多导致本问题中讨论的预防措施的旧漏洞在现代浏览器中已不再是问题。 我将把下面的答案作为一个历史性的好奇心留下,但实际上,自2010年(!)提出这个问题以来,整个话题已经发生了根本性的变化。
它可以防止它被用作一个简单的<script>
标签的目标。(这样,坏人就不能把脚本标签放在他们自己的网站上,并依靠一个活动会话来获取你的内容了。
编辑 — 注意评论(和其他答案)。这个问题与颠覆的内置设施有关,特别是Object
和Array
构造器。这些都可以被改变,从而使原本无害的JSON,在解析时可以触发攻击者的代码。