我不清楚脚本在运行时究竟能做些什么。
它是否同样在从同一个域加载的JavaScript中享有特权?是否可以依赖JSONP的其他限制?
答案 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, ... });
然而,页面上的代码真的无法判断是否真的发生了这一切。