0

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

但是我在理解某些东西时遇到了问题:

Facebook(以及其他)for(;;) || while(1)在他们的 json 响应中使用了这个东西:

在此处输入图像描述

而且 - 显然 - 如果我想使用数据,我必须删除for(;;)字符串然后自己解析它。

我还被告知(@esailija):

除非您来自同一来源,否则您无法删除 for 循环

好的 - 这是因为相同的原产地政策。

我问这个:

假设 John 在他的网站 ( john.com) 上这样做:

 bla bla...
   <script src="facebook.com/ajax/recent" type="text/javascript"></script>
 bla bla...

请注意它与 facebook 的 url相同(我最左边的红色箭头) -

假设

  • 如果他得到了回应,<scrip>...</script>而回应却没有,for(;;)-他仍然无能为力{"__ar:1,....}!必须用它填充(如 jsonp)myCallBack({"__ar:1,....});

我的意思是:就像这样:

var a=1;

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

var b=1;

问题 :

我错过了什么,我的假设是否正确?

4

3 回答 3

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(;;). 但是因为有,我的页面将无限循环。

于 2013-10-01T08:15:44.463 回答
1

你的第一个假设是错误的,但第二个是正确的。

尽管您不能向不同的来源发出 AJAX 请求,但您可以从不同的来源加载脚本。这就是 JSONP 向不同来源发出请求的方式。

正是因为这个原因,JSONP 格式与 JSON 不同。它是封装在函数调用中的 JSON,以便您可以使用响应。正如您所假设的,JSON 响应在作为脚本加载时是无用的,因为它只会被评估然后被丢弃。

编辑

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

于 2013-10-01T07:23:18.217 回答
1

如果他得到响应并且(如您所说)它for(;;);在开始时没有,那么它将是一段有效的 JavaScript 代码(一个对象初始化器),其结果没有存储在任何地方。它会无害地运行。但是以这种方式保护他们的 JSON 提要的人们不希望它们在被这样滥用时无害地运行,所以他们在开始时添加了这种故意污染,以便试图滥用它们是痛苦的,因为它会触发一个无限循环。

在开始时使用具有这种故意污染的提要的典型方法依赖于同一来源(或至少,他们的 CORS 政策允许的来源):您通过 ajax 作为文本加载提要,剥离前导for(;;);,然后将其余部分解析为 JSON。

于 2013-10-01T07:17:39.327 回答