javascript - 为什么Google prepend while( ) ; 添加到他们的JSon响应?

  显示原文与译文双语对照的内容

这是我一直都很好奇的东西,就是为什么谷歌将 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(),但是你真正需要做的就是替换它,然后你就会被设置。 我认为评估防止是确保人们写安全的JSON解析代码。

我看过这个使用在其他几个地方,也但更多的与谷歌( 邮件,日历,联系人,等等 ) 奇怪的是, Google Docs 开始 &&&START&&& 相反,谷歌的联系人似乎开始了 while(1); &&&START&&&

有人知道这里发生了什么?

时间:

它防止 JSON劫持

虚构的例子:说谷歌有一个像 mail.google.com/json?action=inbox 这样的URL,它返回你收件箱的前 50条消息。 由于same-origin策略,其他域上的邪恶网站无法使AJAX请求获得这里数据,但它们可以通过 <script> 标记包含 URL 。 url访问你 Cookies,覆盖全球阵列构造函数或者访问器方法他们可以有一个方法叫做每当( 数组或者哈希) 对象属性设置,允许他们阅读的json内容。

while(1); 或者 &&&BLAH&&& 可以防止: mail.google.com 处的一个AJAX请求将对文本内容有完全的访问权,并且可以将它的剥离。 但是 <script> 标记插入盲目地执行JavaScript而没有任何处理,导致无限循环或者语法错误。

这没有解决cross-site请求伪造的问题。

这是为了确保其他网站不能做一些令人讨厌的把戏来窃取你的数据。 例如通过替换数组构造函数,然后通过 <script> 标记包含这个 JSON URL,一个恶意的第三方站点可以从JSON响应中窃取数据。 通过在开头放置 while(1);,脚本将挂起。

另一方面,使用XHR和一个独立的JSON解析器的same-site请求可以很容易地忽略 while(1); 前缀。

它阻止通过JSON劫持的响应。

理论上,谷歌响应的JSON受到同源策略的保护: 来自一个域的页面无法从其他域( 除非明确允许) 上的页面获得任何信息。

攻击者可以请求页面在其他领域代表你, 比如 通过使用 <script src=...> 或者 <img> 标签,但不能得到任何结果( 页眉,内容) 信息。

因此,攻击者在访问 gmail.com 时无法从读取你的电子邮件。

除了使用脚本标记请求JSON内容之外,JSON在一个受控的攻击者环境中作为Javascript执行。 如果攻击者可以替换在对象构造过程中使用的数组或者对象contructor或者其他方法,那么JSON中的任何内容都会通过攻击者的代码,并被公开。

注意,在JSON作为Javascript执行时,而不是在解析时发生。

有多个计数器度量值:

确保JSON从不执行

通过在JSON数据之前放置一个 while(1); 语句,谷歌确保JSON数据永远不会作为Javascript执行。

只有合法的页面才能获取整个内容,去掉 while(1);,并将余数解析为 JSON 。

确保JSON不是有效的Javascript

类似地,在JSON之前添加无效的标记,比如 &&&START&&& ,确保从未执行过。

总是返回外部带有对象的JSON

这是 OWASP 推荐保护从json劫持, LESS 侵入。

前面的counter-measures类似,它确保JSON从不作为Javascript执行。

一个有效的JSON对象,如果没有被任何东西包围,在Javascript中是无效的:


eval('{"foo":"bar"}')
//SyntaxError: Unexpected token :

这是有效的JSON:


JSON.parse('{"foo":"bar"}')
//Object {foo:"bar"}

因此,确保在响应的顶层总是返回一个对象,确保JSON不是有效的Javascript,同时仍然是有效的JSON 。

上述方法的比较

OWASP的方式不受干预,因为它不需要客户端库更改,并且传输有效的JSON 。 它不确定过去或者未来的浏览器 Bug 是否会破坏这个。

为了支持自动 de-serialization,它需要客户端库的方式,并且可以考虑在浏览器 Bug 方面更加安全。

这两种方法都需要服务器更改,以避免开发人员意外发送易受攻击的JSON 。

这将使第三方难以将JSON响应插入到带有 <script> 标记的HTML文档中。 记住 <script> 标记与相同的同源策略

它防止它被用作简单 <script> 标记的目标。 (好吧,它并不能阻止它,但是它不愉快。)不仅仅这样坏人可以把脚本标记在他们自己的网站,依靠一个活跃的会话可以取回你的内容。

—注释注释( 和其他的答案) 。 这个问题与被破坏的内置设施有关,特别是 ObjectArray 构造函数。 这些可以被改变,这样,当被解析的时候,可以触发攻击者的代码。

...