Json从不同的域访问 - 澄清?

时间:2013-10-01 07:13:36

标签: javascript ajax cross-domain

(我已经知道ajax调用必须来自同一个来源,并且已经阅读了相关的answers

但是我有一个问题需要理解:

Facebook(以及其他人)在他们的json回复中使用for(;;) || while(1)事物:

enter image description here

并且 - 显然 - 如果我想使用我必须删除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,....});
  • 填充(如jsonp)

我的意思是:就像这样:

var a=1;

{"__ar:1,....}  <--- john can't do nothing with this.

var b=1;

问题:

我缺少什么,我的假设是否正确?

3 个答案:

答案 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响应在作为脚本加载时是无用的,因为它只会被评估然后被丢弃。

修改

跟上编辑;第一个假设(请求根本不起作用)已从问题中删除。