当前位置: 首页 > 面试题库 >

为什么有“ while(1);” 在XmlHttpRequest响应?

曹子平
2023-03-14
问题内容

为什么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(邮件,日历,通讯录等)中使用了更多功能。奇怪的是,GoogleDocs以开头,&&&START&&&而Google
Contacts似乎以开头while(1); &&&START&&&

这里发生了什么?


问题答案:

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

人为的例子:假设Google有一个类似的URL
mail.google.com/json?action=inbox,它以JSON格式返回收件箱中的前50条消息。由于同源政策,其他域上的邪恶网站无法发出AJAX请求来获取此数据,但是它们可以通过<script>标记包含URL
。随 您的 cookie 一起访问URL ,并且通过覆盖全局数组构造函数或访问器方法,只要设置了对象(数组或哈希)属性,它们就可以拥有一个被调用的方法,从而允许它们读取JSON内容。

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

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



 类似资料:
  • 问题内容: 这个问题引起了有关perl中无限循环的问题:while(1)Vs。for(;;)是否存在速度差异?,我决定在python中运行类似的比较。我希望编译器会为和生成相同的字节码,但是python2.7实际上不是这种情况。 以下脚本: 产生以下结果: 使用明显更复杂。为什么是这样? 在其他情况下,python的行为就好像等于1: 为什么要区分两者? 我注意到python3确实使用相同的操作评

  • 问题内容: 为什么Google会优先使用其(私有)JSON响应? 例如,这是在Google日历中打开和关闭日历时的响应: 我认为这是为了防止人们对此进行操作,但是您真正要做的就是替换,然后进行设置。我认为评估是为了确保人们编写安全的JSON解析代码。 我也曾在其他几个地方使用过此功能,但在Google(邮件,日历,通讯录等)中使用了更多功能。奇怪的是,Google Docs 以开头,而Google

  • 问题内容: 我总是想知道为什么这么称呼这个对象? 您的请求正文不必为XML格式。同样,可以将从服务器接收的数据提取为JSON,XML,HTML或纯文本。XML在此对象中没有扮演重要角色。这是陈词滥调吗?首次创建时该对象是什么? 问题答案: 由Microsoft的Outlook Web Access团队发明。这个高度创新的团队以前为我们提供了远程脚本编写,这是“ AJAX”样式开发的开始。远程脚本编

  • 本文向大家介绍为什么“ while(i ++ 相关面试题,主要包含被问及为什么“ while(i ++ 时的应答技巧和注意事项,需要的朋友参考一下 正如其他人指出的那样,该测试在许多方面都有缺陷。 你没有告诉我们到底 如何 ,你做了这个测试。但是,我试图实施这样的“幼稚”测试(无冒犯): 当使用默认设置运行它时,似乎有很小的差异。但是,当您使用该标志运行基准测试时,基准测试的 真正 缺陷就变得显而

  • 本文向大家介绍do……while和while……do有什么区别?相关面试题,主要包含被问及do……while和while……do有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 前一个循环一遍再判断,后一个判断以后 再循环。    

  • 问题内容: -1作为转换为二进制的int表示为321。当我右移31次时,得到1(31个0和一个1)。但是当我右移32次时,我又得到-1。它不应该等于0吗? 问题答案: Java规范对移位运算符的解释如下: 如果左侧操作数的提升类型为,则仅将右侧操作数的最低5位用作移位距离。就像右手操作数受到掩码值的按位逻辑AND运算符(第15.22.1节)一样。因此,实际使用的移动距离始终在0到31(含)范围内。