在浏览一些前端开发中的问题时,可能不少开发者都注意到 Google 的 JSON 响应前面会有一个奇怪的 while(1);
声明。这是什么缘故呢?本文将详细解释这种做法背后的技术原因。
防范 JSON 劫持
这是为了防止通过 JSON 劫持(JSON Hijacking)来泄露响应内容。理论上,HTTP 响应的内容应该由同源策略(Same Origin Policy)保护,来自不同域的页面无法获取信息,除非特意授权给这些页面。
尽管同源策略在正常情况下提供了保护,但攻击者仍能通过某些手段发起请求,例如通过使用 <script src=...>
或 <img>
标签。不过,这样攻击者无法获取关于结果的任何信息(如头信息、内容)。
例如,当你访问某个攻击网站时,即使这个网站能够通过脚本标签请求到你在 gmail.com 上的邮件,它也不能读取这些邮件的内容。
然而,当使用脚本标签请求 JSON 内容时,JSON 会作为 JavaScript 在攻击者控制的环境中执行。如果攻击者能够替换数组或对象构造函数,亦或是在对象构造期间使用的某些方法,JSON 中的任何内容都将通过攻击者的代码,并泄露出去。
需要注意的是,这种情况发生在 JSON 作为 JavaScript 执行时,而不是在 JSON 被解析时。
多种防御措施
确保 JSON 永远不执行
通过在 JSON 数据前放置一个 while(1);
声明,Google