【问题标题】:How Same-origin policy works?同源政策如何运作?
【发布时间】:2016-05-22 08:33:12
【问题描述】:

根据https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy ,浏览器限制同源内的资源访问。但是,我认为几乎每个网站都有类似的内容:

<script src="http://partner.googleadservices.com/gpt/pubads_impl_79.js" async=""></script>

而且这里的 src 是一个外部资源。是否违反同源政策?

【问题讨论】:

  • 您不能通过 AJAX 从不同的来源(主机/端口)加载资源。脚本标签可以从不同的来源加载。这就是 JSONP 的工作原理。
  • 我明白了。谢谢,@bash0r!
  • 脚本标签在某种意义上是特殊的,它可以执行跨域调用。但开发者无法检索其内容。
  • @blindProgrammer 使用 JSONP 你可以。 (请参阅我更新的答案中的链接)。
  • @blindProgrammer 啊,是的。如您所说,innerHTML 不可访问。 :) 很抱歉造成混淆!

标签: w3c same-origin-policy


【解决方案1】:

让我们假设 partener.googleadservices.com 作为站点 B,而您的某些网站说 www.foobar.com 作为站点 B
对于 GET 以外的请求(如 POST、PUT 等)和具有自定义标头的 GET,浏览器会向 B(HTTP OPTIONS)发送一个飞行前请求,其中 Origin 标头包含站点 A 的值。站点 B 然后可以验证这一点值并使用 Access-Control-Allow-Origin 标头进行响应(它也可以简单地传递 '*' 来指示允许所有网站)。
如果 Access-Control-Allow-Origin 的值不包含站点 A,则遵守 CORS 策略的浏览器只会阻止该请求。

对于您对&lt;script&gt; 标记的查询,我观察到站点A 发送了一个GET 请求。因此,在这种情况下,浏览器没有义务阻止对站点 B 的访问,因为它不是 GET 并且也不发送任何自定义标头。您可以在 chrome 浏览器中打开 Inspect 模式并观察正在进行的调用。

查看https://en.wikipedia.org/wiki/Cross-origin_resource_sharing#How_CORS_works了解更多详情

【讨论】:

    【解决方案2】:

    同源策略会影响所谓的 AJAX 请求。它与脚本标签无关。脚本标签可以加载来自不同来源的资源。进一步澄清来源:如果主机(例如 www.google.com)或端口(例如 80)不同,则来源不同。 JSONP (https://en.wikipedia.org/wiki/JSONP) 滥用脚本标签来解决同源策略。所以它不违反同源政策。

    【讨论】:

      猜你喜欢
      • 2011-12-01
      • 2011-08-17
      • 2014-05-03
      • 2012-11-14
      • 2015-08-19
      • 2015-08-25
      • 2010-12-17
      相关资源
      最近更新 更多