Google在JSON响应前添加while(1);的原因解析
Google在JSON响应前添加while(1);的原因解析
技术背景
在Web开发中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于前后端之间的数据传输。然而,JSON存在一个安全问题,即JSON劫持(JSON Hijacking)。在早期,浏览器对于通过<script>
标签引入的跨域资源没有严格的访问限制,这就给攻击者提供了可乘之机。攻击者可以利用这个漏洞,通过<script>
标签引入包含敏感信息的JSON数据,并通过重写全局数组构造函数或访问器方法来获取这些数据。
实现步骤
攻击者的操作步骤
- 诱导用户访问恶意页面:攻击者诱使用户访问包含恶意代码的页面。
- 发起跨域请求:在恶意页面中,攻击者通过
<script>
标签引入目标网站的JSON数据URL。由于<script>
标签不受同源策略的限制,浏览器会使用用户的身份信息(如Cookie)发起请求。 - 获取敏感数据:攻击者通过重写全局数组构造函数或访问器方法,在JSON数据解析过程中获取其中的敏感信息。
Google的防范措施
为了防止JSON劫持,Google在JSON响应前添加了while(1);
语句。具体步骤如下:
- 服务器端处理:当服务器生成JSON响应时,在响应内容的开头添加
while(1);
。 - 合法请求处理:对于合法的AJAX请求,客户端代码可以完整获取响应内容,并通过简单的字符串处理去除
while(1);
,然后正常解析JSON数据。 - 恶意请求处理:当攻击者通过
<script>
标签引入该JSON数据时,浏览器会直接执行该JavaScript代码,由于while(1);
是一个无限循环,代码会陷入死循环,从而阻止攻击者获取敏感数据。
核心代码
以下是一个简单的示例,展示了合法请求如何处理包含while(1);
的JSON响应:
1 |
|
最佳实践
始终返回外层为对象的JSON数据
这是OWASP推荐的防止JSON劫持的方法。由于JSON对象在JavaScript中需要通过{}
包裹,而单独的{}
在JavaScript中会被解释为代码块,因此直接使用<script>
标签引入这样的JSON数据会导致语法错误。
1 |
|
仅对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劫持的安全问题。因此,在大多数情况下,现代浏览器已经不再受此问题的影响。然而,为了兼容旧版本的浏览器,仍然可以考虑使用这种方法。