Google在JSON响应前添加while(1);的原因解析

Google在JSON响应前添加while(1);的原因解析

技术背景

在Web开发中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于前后端之间的数据传输。然而,JSON存在一个安全问题,即JSON劫持(JSON Hijacking)。在早期,浏览器对于通过<script>标签引入的跨域资源没有严格的访问限制,这就给攻击者提供了可乘之机。攻击者可以利用这个漏洞,通过<script>标签引入包含敏感信息的JSON数据,并通过重写全局数组构造函数或访问器方法来获取这些数据。

实现步骤

攻击者的操作步骤

  1. 诱导用户访问恶意页面:攻击者诱使用户访问包含恶意代码的页面。
  2. 发起跨域请求:在恶意页面中,攻击者通过<script>标签引入目标网站的JSON数据URL。由于<script>标签不受同源策略的限制,浏览器会使用用户的身份信息(如Cookie)发起请求。
  3. 获取敏感数据:攻击者通过重写全局数组构造函数或访问器方法,在JSON数据解析过程中获取其中的敏感信息。

Google的防范措施

为了防止JSON劫持,Google在JSON响应前添加了while(1);语句。具体步骤如下:

  1. 服务器端处理:当服务器生成JSON响应时,在响应内容的开头添加while(1);
  2. 合法请求处理:对于合法的AJAX请求,客户端代码可以完整获取响应内容,并通过简单的字符串处理去除while(1);,然后正常解析JSON数据。
  3. 恶意请求处理:当攻击者通过<script>标签引入该JSON数据时,浏览器会直接执行该JavaScript代码,由于while(1);是一个无限循环,代码会陷入死循环,从而阻止攻击者获取敏感数据。

核心代码

以下是一个简单的示例,展示了合法请求如何处理包含while(1);的JSON响应:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 模拟AJAX请求
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://example.com/json-data', true);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
// 获取响应内容
let responseText = xhr.responseText;
// 去除while(1);
responseText = responseText.replace('while(1);', '');
// 解析JSON数据
const jsonData = JSON.parse(responseText);
console.log(jsonData);
}
};
xhr.send();

最佳实践

始终返回外层为对象的JSON数据

这是OWASP推荐的防止JSON劫持的方法。由于JSON对象在JavaScript中需要通过{}包裹,而单独的{}在JavaScript中会被解释为代码块,因此直接使用<script>标签引入这样的JSON数据会导致语法错误。

1
2
3
4
// 正确的JSON响应
const validJson = '{"data": ["value1", "value2"]}';
// 错误的JSON响应(可能被劫持)
const invalidJson = '["value1", "value2"]';

仅对POST请求返回JSON数据

由于<script>标签只能发起GET请求,因此只对POST请求返回JSON数据可以有效防止通过<script>标签进行的JSON劫持。

实现跨站请求伪造(CSRF)保护

要求所有JSON请求携带预定义的随机值,确保请求的合法性。

常见问题

为什么不使用CSRF令牌来防止JSON劫持?

存储和维护CSRF令牌需要大量的基础设施和成本,并且会影响缓存。在Google这样的大规模应用中,使用while(1);这样的方法可以将部分安全检查工作转移到客户端,减少服务器端的负担。

返回外层为对象的JSON数据是否完全安全?

虽然返回外层为对象的JSON数据可以有效防止大部分JSON劫持攻击,但仍然存在一些潜在风险。例如,某些浏览器的错误处理机制可能会泄露部分数据。因此,建议结合多种安全措施来确保数据的安全性。

现在是否还需要使用while(1);来防止JSON劫持?

随着现代浏览器的发展,ECMAScript 5正式修复了JSON劫持的安全问题。因此,在大多数情况下,现代浏览器已经不再受此问题的影响。然而,为了兼容旧版本的浏览器,仍然可以考虑使用这种方法。


Google在JSON响应前添加while(1);的原因解析
https://119291.xyz/posts/2025-04-17.reason-of-google-prepending-while1-to-json-responses/
作者
ww
发布于
2025年4月17日
许可协议