可能是重复问题:
为什么谷歌在其JSON响应中添加while(1)?
谷歌返回的json格式如下:
throw 1; <dont be evil> { foo: bar}
而 Facebook 的 ajax 返回的 JSON 数据如下:
for(;;); {"error":0,"errorSummary": ""}
- 为什么会放置能够停止执行并且产生无效json的代码?
- 如果它是无效的并且在尝试执行时会崩溃,如何对其进行解析?
- 他们只是将其从字符串中删除(似乎很昂贵)吗?
- 这样做是否有安全优势?
作为回应这是出于安全目的:
如果爬虫位于另一个域上,他们必须使用script
标签来获取数据,因为XHR不会跨域工作。即使没有for(;;);
,攻击者如何获取数据?它没有被赋值给变量,所以难道不会因为没有引用而被垃圾收集吗?
基本上,要跨域获取数据,他们必须执行:
<script src="http://target.com/json.js"></script>
即使没有添加崩溃脚本,攻击者也无法使用任何Json数据,除非将其分配给您可以全局访问的变量(在这些情况下不是这样)。 崩溃代码实际上什么也没做,因为即使没有它,他们也必须使用服务器端脚本才能在其站点上使用数据。