【问题标题】:How does same origin policy (SOP) work?同源政策 (SOP) 如何运作?
【发布时间】:2011-12-01 19:00:21
【问题描述】:

我在 Wikipedia 上阅读了同源政策的含义,但不明白它是如何工作的。我知道它会阻止例如我网站上的 javascript 与单独网站上的脚本进行交互,但这到底意味着什么?

【问题讨论】:

标签: javascript same-origin-policy


【解决方案1】:

这意味着如果你加载

http://www.stackoverflow.com/

并且您的浏览器会加载 javascript,然后该 javascript 无法访问不是来自该页面的 url。有很多细节,比如你无法访问

https://www.stackoverflow.com

但是ajax请求可以访问

http://www.stackoverflow.com/something/something

浏览器本身不允许触发请求。

编辑——这可能是有用的:http://www.google.com/support/forum/p/Chrome/thread?tid=171316324d16747b&hl=en

【讨论】:

  • 是的,意味着浏览器不会发送请求,因为它违反了同源策略
  • 正确并纠正我我错了。它不能的原因是因为它是一个不同的协议,但是它提出了一个问题,你是什么意思“访问”。 javascript 是否试图从同一个站点但使用不同的协议访问信息并因此失败?什么是'this'信息?可以是什么?
【解决方案2】:

如果您的脚本 (JS) 尝试向站点执行一些 HTTP 请求,而不是通过 XMLHttpRequest 发起的请求,则请求将失败,返回状态代码将为 0 并且错误消息 - null。

这就是它最初的工作方式。

现在有一个跨域资源共享 (CORS) 规范,大多数现代浏览器或多或少都支持该规范。它允许执行此类请求,但有严格的限制。

【讨论】:

  • 谢谢,但我对perform some HTTP request to the site other than the one it originated from via XMLHttpRequest 的声明感到困惑。 to the site than the one it originated from 是什么意思?你的意思是如果我加载一个网站,例如www.example.com 和 javascript 加载了该网页,并且它 (JS) 尝试发出 XMLHTTP 请求说 www.example1.com,它会失败。对吗?
  • @PeanutsMonkey:是的,完全正确。子域和端口号也将计算在内,例如,如果您的脚本是从 http://localhost/examplescript.js 加载的,那么其中的 XMLHttpRequest 将能够访问 http://localhost/something 但将无法访问 http://www.localhost/somethinghttp://localhost:8080/something
  • 谢谢。我接受它,但是它可以遍历无限数量的子目录,例如localhost/sub1/sub2/sub3 等?如果我使用 IFRAME,这并不重要,即通过 IFRAME 从另一个域加载另一个页面的页面?同源策略也仅限于 JS 吗?
  • 首先,是的,遍历是无限的(嗯,受一般 url 长度限制等限制,不受 SOP 限制)。其次,IFRAME 将受到类似限制,仅针对从中加载它的域。 IE。如果您从 [example.com] 加载了一个页面,并且 IFRAME 有一个源 [example1.com],那么 IFRAME 中的 Javascript 将可以访问所有 [example1.com] 资源,但无法访问 [example.com]。第三:是的,仅限于 JS XMLHttpRequest 对象。
  • 谢谢。当您说它仅限于 JS XMLHTTPRequest 时,我认为您只是指使用 JS 的站点,但是使用 Java 或 Flash 等的站点呢?
猜你喜欢
  • 2011-04-16
  • 2016-05-22
  • 2011-08-17
  • 2014-05-03
  • 1970-01-01
  • 2012-11-14
  • 2015-08-19
相关资源
最近更新 更多