【发布时间】:2015-10-16 05:25:39
【问题描述】:
JSONP 被称为“绕过”同源策略。我认为这意味着使用它允许脚本从不同域的远程服务器加载并在网站上本地运行。
我不清楚脚本在运行时究竟可以做什么。
它是否与从同一个域加载的 JavaScript 一样具有特权?对 JSONP 施加的任何其他限制是否值得信赖?
【问题讨论】:
标签: javascript jsonp
JSONP 被称为“绕过”同源策略。我认为这意味着使用它允许脚本从不同域的远程服务器加载并在网站上本地运行。
我不清楚脚本在运行时究竟可以做什么。
它是否与从同一个域加载的 JavaScript 一样具有特权?对 JSONP 施加的任何其他限制是否值得信赖?
【问题讨论】:
标签: javascript jsonp
在浏览器中,<script> 标签可以引用位于任何域中的脚本。脚本资源不受 Ajax 请求的同源限制。
因此,您可以动态插入一个脚本标签,该标签将引用任何域上的脚本,并且它将成功加载并且不会被同源限制阻止。
这就是 JSONP 的工作方式 - 通过请求远程脚本加载和运行来发出跨源请求。这不是完全绕过同源限制,因为您不能直接使用 JSONP 进行远程 API 调用,因为您正在联系的服务器必须明确支持 JSONP,因为它是一种完全不同类型的响应。因此,本质上,您正在联系的服务器必须明确支持并允许通过 JSONP 进行跨源请求。
我不清楚脚本究竟可以做什么,而 它正在运行。
一旦您请求 JSONP 脚本,该脚本只是在您的页面中运行的一段 Javascript。它实际上可以做任何在您的页面中运行的任何脚本都可以做的事情。
它是否与从同一域加载的 JavaScript 一样具有特权? 是否对 JSONP 施加了任何额外的限制? 指望吗?
这只是一个在您的页面中运行的脚本。它可以做任何在您的页面中运行的任何脚本都可以做的事情。按照惯例,它应该调用在 URL 中指定的回调函数并向其传递一些数据(请求的结果),但它可以执行页面中的 Javascript 可以执行的任何其他操作。
对 JSONP 脚本没有其他限制。浏览器不知道脚本是否为 JSONP 脚本。它只是一个脚本,可以做与任何其他脚本完全相同的事情。
JSONP 基本上是一种在浏览器支持 CORS 之前解决问题的 hack。如果您可以使用 CORS,这些天我想不出任何理由来设计基于 JSONP 的解决方案。 CORS 更安全,因为它不会让其他网站在您的页面上下文中运行随机 Javascript。
【讨论】:
JSONP 通过使用普通的<script> 标签和通过 HTTP GET 以 JavaScript 获取的内容来工作。浏览器基本上认为它只是获取另一个脚本供页面使用,因此第三方站点响应的代码可以做任何它想做的事情。
按照惯例,“行为良好”的 JSONP 源会发回对函数的调用,该函数的名称是 URL 中的“回调”参数。也就是说,服务器用 JavaScript 语句响应:
yourCallback({ name: value, ... });
但是,页面上的代码确实无法判断这是否真的发生了。
【讨论】: