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

Javascript 从不同域访问Json-澄清?,javascript,ajax,cross-domain,Javascript,Ajax,Cross Domain,(我已经知道ajax调用必须来自同一来源,并且已经阅读了相关的文档) 但我在理解某些东西时遇到了问题: Facebook(除其他外)在json响应中使用(;)| | while(1)的: 显然,如果我想使用数据,我必须删除(;)字符串的,然后自己解析它 (通过@esailija)还告诉我: 除非您来自同一原点,否则无法删除for循环 好的,很好-这是因为同一原产地政策 但是我问: 假设John正在他的网站上做这件事(John.com): 问题: 我遗漏了什么?我的假设是否正确?如果他得到了回答

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

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

Facebook(除其他外)在json响应中使用(;)| | while(1)的

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

(通过@esailija)还告诉我:

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

好的,很好-这是因为同一原产地政策

但是我问:

假设John正在他的网站上做这件事(
John.com
):

问题:


我遗漏了什么?我的假设是否正确?

如果他得到了回答(正如你所说)没有(;;)的
开始时,它将是一段有效的JavaScript代码(对象初始值设定项),其结果不会存储在任何地方。它将无害地运行。但是,以这种方式保护JSON提要的人不希望它们在这样被误用时无害地运行,因此他们在一开始就添加了这种故意污染,因此尝试误用它们是痛苦的,因为这会引发无休止的循环


在一开始使用这种故意污染的提要的典型方式依赖于相同的来源(或者至少是CORS策略允许的来源):您通过ajax将提要作为文本加载,去掉(;;)的前导
,然后将剩余部分解析为JSON。

如果他得到响应(如您所说)它没有(;;)的
开始时,它将是一段有效的JavaScript代码(对象初始值设定项),其结果不会存储在任何地方。它将无害地运行。但是,以这种方式保护JSON提要的人不希望它们在这样被误用时无害地运行,因此他们在一开始就添加了这种故意污染,因此尝试误用它们是痛苦的,因为这会引发无休止的循环


在一开始使用这种故意污染的提要的典型方式依赖于相同的来源(或者至少是CORS策略允许的来源):您通过ajax将提要作为文本加载,去掉(;;)的前导
,然后将其余部分解析为JSON。

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

即使不能对不同的源执行AJAX请求,也可以从不同的源加载脚本。这就是JSONP对不同来源的请求的方式

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

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

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

即使不能对不同的源执行AJAX请求,也可以从不同的源加载脚本。这就是JSONP对不同来源的请求的方式

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

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

当时的问题是,使用看起来像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.

数组=函数(){
//窃取价值观等
};
//上面的代码类似于[{profile_id},{},…],它调用数组构造函数
//有了这些价值观,我就能接触到它们。

如果您在登录facebook时在旧浏览器上访问我的页面(我指的是旧的,如firefox 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.

数组=函数(){
//窃取价值观等
};
//上面的代码类似于[{profile_id},{},…],它调用数组构造函数
//有了这些价值观,我就能接触到它们。

如果您在登录facebook时在旧浏览器上访问我的页面(我指的是旧的,如firefox 2),如果没有(;;)
,我可以在数组构造函数中以静默方式获取您的数据。但是因为有,我的页面将无限循环。

是的,我删除了第一个假设,因为
script
更强大。p、 你有没有注意到有这样一个问题,因为我写了
example@RoyiNamir:只要你把它们放在backticks中,你就没事了:
大多数浏览器都可以访问脚本标记的文本?怎样?从未听说过:-(@RoyiNamir:那是我的想法:-)是的,我删除了第一个假设,因为
脚本
更强大。p、 你有没有注意到有这样一个问题,因为我写了
example@RoyiNamir:只要你把它们放在backticks中,你就没事了:
大多数浏览器都可以访问脚本标记的文本?怎样?从未听说过:-(@RoyiNamir:那是我的拿手货.)