通过JSONP可以远程访问JavaScript的资源是什么?

时间:2015-07-25 17:23:14

标签: javascript jsonp

据说JSONP" by-pass"相同的原产地政策。我认为这意味着使用它允许脚本从不同域上的远程服务器加载并在网站上本地运行。

我不清楚脚本在运行时究竟能做些什么。

它是否同样在从同一个域加载的JavaScript中享有特权?是否可以依赖JSONP的其他限制?

2 个答案:

答案 0 :(得分:1)

在浏览器中,<script>标记可能引用位于任何域中的脚本。脚本资源不受Ajax请求的相同来源限制。

因此,您可以动态插入一个脚本标记,该标记将引用任何域上的脚本,并且它将成功加载,不会被相同的原始限制阻止。

这就是JSONP的工作原理 - 通过请求加载和运行远程脚本来发出跨源请求。它不是对相同原点限制的一揽子绕过,因为您不能直接使用JSONP进行远程API调用,因为您要联系的服务器必须明确支持JSONP,因为它是一种完全不同类型的响应。因此,从本质上讲,您联系的服务器必须通过JSONP明确支持并允许此跨源请求。

  然而,我并不清楚脚本究竟能做些什么   它正在运行。

一旦您请求JSONP脚本,该脚本就只是您页面中运行的一段Javascript。它可以完全执行页面中运行的任何脚本都可以执行的操作。

  

它是否同样在从同一个域加载的JavaScript中享有特权?   是否可以对JSONP施加任何额外限制   指望?

它只是在您的页面中运行的脚本。它可以执行页面中运行的任何脚本都可以执行的任何操作。按照惯例,它应该调用URL中指定的回调函数并传递一些数据(请求的结果),但是它可以执行页面中Javascript可以执行的任何其他操作。

JSONP脚本没有其他限制。浏览器不知道脚本是否是JSONP脚本。它只是一个脚本,可以完成与任何其他脚本完全相同的事情。

JSONP基本上是一个在浏览器支持CORS之前解决问题的黑客攻击。如果您可以使用CORS,我现在无法想到基于JSONP设计解决方案的任何原因。 CORS更安全,因为它不会让其他网站在您的页面上下文中运行随机Javascript。

答案 1 :(得分:0)

JSONP的工作原理是使用普通的<script>标记和通过HTTP GET作为JavaScript获取的内容。浏览器基本上认为它只是提取另一个脚本供页面使用,因此第三方站点响应的代码可以做任何想做的事情。

“表现良好”JSONP源会按照惯例发送回一个函数,该函数的名称是URL中的“callback”参数。也就是说,服务器使用JavaScript语句进行响应:

yourCallback({ name: value, ... });

然而,页面上的代码真的无法判断是否真的发生了这一切。