Javascript 通过JSONP可以远程访问哪些资源?

Javascript 通过JSONP可以远程访问哪些资源?,javascript,jsonp,Javascript,Jsonp,JSONP被称为“旁路”同源策略。我认为这意味着使用它允许脚本从不同域上的远程服务器加载,并在本地网站上运行 但是,我不清楚脚本在运行时究竟可以做什么 从同一个域加载的JavaScript是否也具有同样的特权?对JSONP有没有其他可以依赖的限制?JSONP通过使用普通的标记和通过HTTP GET获取的JavaScript内容来工作。浏览器基本上认为它只是获取另一个脚本供页面使用,因此第三方网站响应的代码可以做任何它想做的事情 按照约定,“行为良好”的JSONP源将返回对函数的调用,该函数的名称

JSONP被称为“旁路”同源策略。我认为这意味着使用它允许脚本从不同域上的远程服务器加载,并在本地网站上运行

但是,我不清楚脚本在运行时究竟可以做什么


从同一个域加载的JavaScript是否也具有同样的特权?对JSONP有没有其他可以依赖的限制?

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

按照约定,“行为良好”的JSONP源将返回对函数的调用,该函数的名称作为URL中的“回调”参数。也就是说,服务器用JavaScript语句响应:

yourCallback({ name: value, ... });
但是,页面上的代码确实无法判断这是否就是所发生的一切。

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

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

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

然而,我不清楚脚本到底能做些什么 它正在运行

一旦您请求一个JSONP脚本,该脚本就是页面中运行的Javascript的一部分。它可以做任何在页面中运行的脚本可以做的事情

从同一个域加载的JavaScript是否也具有同样的特权? 有没有对JSONP施加任何额外的限制 指望什么

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

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


JSONP基本上是一种在浏览器支持CORS之前解决问题的黑客。如果可以使用CORS,我想不出还有什么理由再设计基于JSONP的解决方案了。CORS更安全,因为它不允许其他站点在页面上下文中运行随机Javascript