代码之家  ›  专栏  ›  技术社区  ›  Jess

为什么google会在(1)之前对其json响应进行预处理?

  •  3776
  • Jess  · 技术社区  · 14 年前

    为什么谷歌要提前 while(1); 他们(私有)的json响应?

    例如,以下是在中打开和关闭日历时的响应 Google Calendar :

    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解析代码。

    我在其他一些地方也看到过这种方法,但在google(邮件、日历、联系人等)中更是如此,奇怪的是, Google Docs 从开始 &&&START&&& 相反,谷歌联系人似乎是从 while(1); &&&START&&& .

    怎么回事?

    6 回复  |  直到 5 年前
        1
  •  4034
  •   PaulMest    5 年前

    它防止 JSON hijacking ,一个主要的json安全问题 fixed 在所有主要浏览器中 since 2011 使用ecmascript 5。

    假想的例子:假设google有一个类似于 mail.google.com/json?action=inbox 它以json格式返回收件箱的前50条消息。由于同源策略,其他域上的邪恶网站无法发出ajax请求以获取此数据,但它们可以通过 <script> 标签。访问url时使用 你的 饼干,还有 overriding the global array constructor or accessor methods 它们可以在设置对象(数组或哈希)属性时调用方法,从而允许它们读取json内容。

    这个 while(1); &&&BLAH&&& 防止这种情况:ajax请求位于 mail.google.com 将可以完全访问文本内容,并可以将其删除。但一 <脚本gt; 标签插入盲目地执行javascript而不进行任何处理,导致无限循环或语法错误。

    这并不能解决 cross-site request forgery .

        2
  •  505
  •   Sayed Mohd Ali    6 年前

    它防止通过json劫持来泄漏响应。

    理论上,http响应的内容受同源策略保护:来自一个域的页面无法从另一个域的页面获取任何信息(除非明确允许)。

    攻击者可以代表您请求其他域上的页面,例如使用 <script src=...> <img> 标记,但它无法获取有关结果(标题、内容)的任何信息。

    因此,如果你访问攻击者的页面,它无法从gmail.com读取你的电子邮件。

    除了使用脚本标记请求json内容时,json在攻击者控制的环境中作为javascript执行。如果攻击者可以替换数组或对象构造函数或在对象构造期间使用的其他方法,则json中的任何内容都将通过攻击者的代码并被公开。

    注意,这发生在json作为javascript执行时,而不是在解析时。

    有多种对策:

    确保json永远不会执行

    放置一个 while(1); 在json数据之前,google确保json数据永远不会作为javascript执行。

    只有一个合法的页面才能得到全部内容,去掉 (1); ,并将其余部分解析为json。

    诸如此类 for(;;); 例如,在facebook上也看到了同样的结果。

    确保json不是有效的javascript

    类似地,在json之前添加无效的标记,比如 &&&START&&& ,确保它永远不会被执行。

    始终返回外部带有对象的json

    这是 OWASP recommended way 以防止json劫持,而且侵入性较小。

    与前面的反措施类似,它确保json永远不会作为javascript执行。

    一个有效的json对象,如果没有被任何东西包围,则在javascript中无效:

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

    但这是有效的json:

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

    因此,确保始终在响应的顶层返回一个对象,确保json不是有效的javascript,同时仍然是有效的json。

    正如@hvd在注释中指出的,空对象 {} 是有效的javascript,知道对象为空本身可能是有价值的信息。

    上述方法的比较

    owasp方式不需要修改客户机库,也不需要传输有效的json,因此侵入性较小。不过,目前还不确定过去或未来的浏览器漏洞是否能战胜这一点。正如@oriadam所指出的,不清楚数据是否可以通过错误处理在解析错误中泄漏(例如window.onerror)。

    google的方法需要客户端库来支持自动反序列化,并且可以考虑在浏览器错误方面更安全。

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

        3
  •  352
  •   hippietrail    10 年前

    这是为了确保一些其他网站不会做恶作剧试图窃取你的数据。例如,通过 replacing the array constructor ,然后通过 <script> tag,恶意的第三方站点可以从json响应中窃取数据。放一个 while(1); 开始时,脚本将挂起。

    另一方面,使用xhr和单独的json解析器的同一个站点请求很容易忽略 (1); 前缀。

        4
  •  102
  •   George Stocker NotMe    11 年前

    这将使第三方难以将json响应插入到具有 <script> 标签。记住 <脚本& GT; 标签不受 Same Origin Policy .

        5
  •  69
  •   Pointy    9 年前

    它防止它被用作 <script> 标签。(好吧,这并不能阻止它,但它会让人不快)这样坏人就不能把脚本标签放在他们自己的网站上,依赖一个活动会话来获取你的内容。

    编辑 -注意评论(和其他答案)。这个问题与被破坏的内置设施有关,特别是 Object Array 施工人员。可以对这些进行修改,以便在解析时,其他无害的json可能触发攻击者代码。

        6
  •  7
  •   Pang Lokesh Desai    6 年前

    自从 <script> Tag不受同源策略的限制,这是Web世界中的一项安全需求, while(1) 当添加到json响应时,可以防止在 <脚本& GT; 标签。