Google返回json,如下所示:
throw 1; <dont be evil> { foo: bar}
和Facebook的ajax具有这样的json:
for(;;); {"error":0,"errorSummary": ""}
出于安全考虑,对此:
如果刮板在另一个域上,则它们将不得不使用script标签来获取数据,因为XHR无法跨域工作。即使没有,for(;;);攻击者也将如何获取数据?它没有分配给变量,所以不会因为没有引用而被垃圾回收吗?
script
for(;;);
基本上要获得跨域数据,他们必须要做
<script src="http://target.com/json.js"></script>
但是,即使没有预先添加崩溃脚本,攻击者也无法使用任何Json数据,除非将其分配给可以全局访问的变量(在这些情况下不是)。崩溃代码实际上无能为力,因为即使没有崩溃代码,他们也必须使用服务器端脚本来使用其站点上的数据。
即使没有,for(;;);攻击者也将如何获取数据?
攻击是基于改变行为的内置类型,特别是Object和Array,通过改变它们的构造函数或其prototype。然后,当目标JSON使用{...}或[...]构造时,它们将成为攻击者自己的那些对象版本,并且具有潜在的意外行为。
Object
Array
prototype
{...}
[...]
例如,您可以将setter-property侵入Object,这会出卖以对象常量编写的值:
Object.prototype.__defineSetter__('x', function(x) { alert('Ha! I steal '+x); });
然后,当将a <script>指向使用该属性名称的JSON时:
<script>
{"x": "hello"}
该值"hello"将被泄漏。
"hello"
数组和对象文字导致setter的调用方式是有争议的。Firefox删除了3.5版中的行为,以响应对备受瞩目的网站的公开攻击。但是,在撰写本文时,Safari(4)和Chrome(5)仍然容易受到此攻击。
所有浏览器现在禁止的另一种攻击是重新定义构造函数:
Array= function() { alert('I steal '+this); }; [1, 2, 3]
目前,IE8的属性实现(基于ECMAScriptFifthEdition标准和Object.defineProperty)目前在Object.prototype或上不起作用Array.prototype。
Object.defineProperty
Object.prototype
Array.prototype
但是,除了保护过去的浏览器外,JavaScript的扩展可能会在将来引起更多类似的潜在泄漏,在这种情况下,谷壳应该也防止此类泄漏。