(我已经知道ajax调用必须来自同一个来源,并且已经阅读了相关的answers)
但是我有一个问题需要理解:
Facebook(以及其他人)在他们的json回复中使用for(;;) || while(1)
事物:
并且 - 显然 - 如果我想使用我必须删除for(;;)
字符串的数据,然后自己解析它。
我也被告知(@esailija):
除非你来自同一个原点,否则你不能删除for循环
好的 - 这是因为同样的原产地政策。
但是我问这个:
让我们说约翰在他的网站(john.com
)上这样做:
bla bla...
<script src="facebook.com/ajax/recent" type="text/javascript"></script>
bla bla...
注意它与Facebook的相同的网址(我最左边的红色箭头) -
假设
<scrip>...</script>
得到回复且回复没有for(;;)
,那么仍然无法做任何事情与{"__ar:1,....}
!
它必须用myCallBack({"__ar:1,....});
我的意思是:就像这样:
var a=1;
{"__ar:1,....} <--- john can't do nothing with this.
var b=1;
问题:
我缺少什么,我的假设是否正确?
答案 0 :(得分:2)
当时的问题是拥有一个看起来像noop的数组文字是不安全的。例如。执行这样的代码:
[1,2,3]
实际上会使用这些值调用数组构造函数。这将远非无害,如下例所示:
<script>
Array = function() {
//Steal the values etc
};
</script>
<script src="facebook.com/yourtimeline.json"></script>
//above has code like [{profile_id}, {},...] which calls the array constructor
//with those values and I have access to them.
如果您在登录Facebook时访问旧版浏览器上的页面(我的意思是旧的,如在firefox 2中),如果没有for(;;)
,我可以在数组构造函数中静默获取数据。但因为有,我的页面将无限循环。
答案 1 :(得分:1)
如果他得到了响应和(如你所说),它在开头没有for(;;);
,那么它将是JavaScript代码的有效段(对象初始值设定项)其结果未存储在任何地方。它将无害地运行。但是那些以这种方式保护他们的JSON feed的人不希望他们在被滥用时无害地运行,所以他们在开始时添加这种故意污染,因此试图滥用它们是痛苦的,因为它会触发无限循环。
在开始时使用这种有意污染的饲料的典型方式依赖于同一来源(或至少是其CORS政策允许的来源):您通过ajax加载饲料作为文本,剥离前导for(;;);
,然后将剩余部分解析为JSON。
答案 2 :(得分:1)
你的第一个假设是错误的,但第二个是正确的。
尽管您无法对其他来源执行AJAX请求,但您可以从其他来源加载脚本。这就是JSONP向不同来源提出请求的方式。
由于这个原因,JSONP格式与JSON不同。它是包含在函数调用中的JSON,因此您可以使用响应。正如您所假设的那样,JSON响应在作为脚本加载时是无用的,因为它只会被评估然后被丢弃。
跟上编辑;第一个假设(请求根本不起作用)已从问题中删除。