为什么Google会优先while(1);使用其(私有)JSON响应?
while(1);
例如,这是在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解析代码。
eval()
while
我也曾在其他几个地方使用过此功能,但在Google(邮件,日历,通讯录等)中使用了更多功能。奇怪的是,Google Docs以开头,&&&START&&&而Google Contacts似乎以开头while(1); &&&START&&&。
&&&START&&&
while(1); &&&START&&&
这里发生了什么?
它可以防止JSON劫持,这是自2011年以来使用ECMAScript 5 在所有主要浏览器中正式修复的主要JSON安全问题。
人为的例子:假设Google有一个类似的URL mail.google.com/json?action=inbox,它以JSON格式返回收件箱中的前50条消息。由于同源政策,其他域上的邪恶网站无法发出AJAX请求来获取此数据,但是它们可以通过<script>标记包含URL 。随 您的 cookie 一起访问URL ,并且通过覆盖全局数组构造函数或访问器方法,只要设置了对象(数组或哈希)属性,它们就可以拥有一个被调用的方法,从而允许它们读取JSON内容。
mail.google.com/json?action=inbox
<script>
的while(1);或&&&BLAH&&&防止这样的:在一个AJAX请求mail.google.com将具有完全访问的文本内容,并且可以去除它扔掉。但是,<script>插入标签会盲目地执行JavaScript,而不进行任何处理,从而导致无限循环或语法错误。
&&&BLAH&&&
mail.google.com
这不能解决跨站点请求伪造的问题。