【问题标题】:When does the same-origin policy apply?什么时候适用同源政策?
【发布时间】:2016-05-24 21:44:10
【问题描述】:

我对此感到非常困惑。当我几年前开始从事 Web 开发时,我记得遇到过 SOP 阻止了我的请求。

然而,从那以后我就忘记了它,并且多年来一直没有遇到它。我知道它仍然存在,但我可以在请求失败的情况下执行 $.ajax 或任何其他此类变体。我公司的页面通过多个框架向 3rd 方服务发出数十个请求,没有任何问题。

有什么关系?仅仅是现代 Web 框架和库知道如何解决它并为我处理它吗?可能是因为我多年来没有手写XMLHttpRequest,所以我不再遇到它了? XMLHttpRequest 是否有一些选项可以解决这个问题,比如origin

【问题讨论】:

  • SOP 从未阻止请求。它确实(并且确实)阻止了对响应的访问。
  • 你在找CORS
  • 投反对票的一个很好的理由(尽管我自己并没有投反对票)是您问我们公司网页中的交易是什么,但您在代码、网络上提供了零技术信息网站等...您的公司网站正在使用,因此除了猜测之外,没有其他方法可以具体回答您的问题。这不是一个好问题,因此可能应该被关闭。
  • @NurbolAlpysbayev - 好吧,这里接受的答案恰好是错误的。第一段是完全错误的。同源策略确实适用于从 Javascript 发出的 GET 调用,实际上它适用于所有来自 Javascript 的任何类型的调用。这与它是否是 GET 无关。这是关于请求的来源。导致 GET 请求的 HTML 标签(如脚本标签和图像标签等)不受同源保护。

标签: javascript ajax browser xmlhttprequest same-origin-policy


【解决方案1】:

基本规则

同源策略适用于从页面向与网页域(包括子域)不同的域发出的任何 HTTP 调用,而不是 GET 调用。

这意味着,如果您向页面添加脚本标记、加载图像或执行任何使用 GET 方法的 HTTP 调用 - 那么您就没有问题。 另一方面,如果您尝试对另一个域使用其他方法,例如 POST、PUT、DELETE 等,则浏览器将阻止调用并引发错误。

解决方法

不过,有几种方法可以解决这个问题。

第一种是使用 GET 调用,但让对方将调用解释为其他内容。 一个很好的例子是一种称为 JSONP 的技术,在该技术中,我们向页面添加了一个脚本标记(这是一个 GET 调用),响应 GET 调用的服务器不仅返回一个常规的 JS 脚本,而是返回它返回一个“独特定制”的响应,它引用原始页面上的代码来告诉它它有一个合适的响应。

有几种模式可以实现这一点,最常见的是内置于 jQuery 中的模式,其中 GET 调用添加了一个带有函数名称的查询参数,并且返回的脚本在全局范围内调用该函数。 jQuery 监听该调用并做出相应响应。 要了解更多信息,请访问此答案:Confused on how a JSONP request works

百搭牌

解决这个问题的新方法是一种比 JSONp 更简洁的解决方案,它称为 CORS,它是浏览器和 Web 服务器之间的一种契约。 本质上,浏览器会做什么(假设它支持 CORS,旧版浏览器不支持)是,浏览器不会完全阻止“非 GET”调用,而是首先对 Web 服务器执行 OPTIONS 调用。网络服务器将查看请求并决定该客户端与它通信的“选项”(AKA 方法)。显然,默认只有一个选项:GET 调用,但您可以设置您的网络服务器以支持其他选项,例如 PUT、DELETE 等。 要了解有关 CORS 的更多信息,请查看 https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

【讨论】:

  • 似乎GET、POST跨域请求都是允许的。您必须使用 CSRF 令牌以避免 CSRF 攻击,这可能发生在 POST 请求中。 developer.mozilla.org/ru/docs/Web/Security/…
  • 这个答案根本不正确。同源策略适用于通过 Javascript 对不同域进行的任何 GET 调用(例如,对不同域的 Ajax 调用)。出于向后兼容性和其他原因,脚本标签、图像标签和其他 HTML 标签(仅进行 GET 调用)根本不实施任何 COR 保护。但是 Ajax 调用受 COR 约束,无论它是 GET、PUT、POST 等。所以,这与它是否是 GET 无关,而是关于导致请求的原因。此外,一些 POST 请求(如表单提交)也不受 CORS 约束。
  • 我意识到我终于明白了 SOP 的工作原理,感谢您的回答。 Mozilla 文档对此并不十分清楚。
猜你喜欢
  • 2012-03-13
  • 2011-08-17
  • 2012-08-12
  • 2012-11-14
  • 2015-08-19
  • 2015-08-25
  • 2010-12-17
相关资源
最近更新 更多