JavaScript 的同源策略

同源策略限制了一个源(origin)中加载文本或脚本与来自其它源(origin)中资源的交互方式。

同源定义

如果两个页面拥有相同协议(protocol)端口(如果指定),和主机,那么这两个页面就属于同一个源(origin)。

下表给出了相对http://store.company.com/dir/page.html同源检测的示例:

参见origin definition for file: URLs.

源继承

来自about:blankjavascript:data:URLs中的内容,继承了将其载入的文档所指定的源,因为它们的URL本身未指定任何关于自身源的信息。

IE特例

在处理同源策略的问题上,IE存在两个主要的不同之处。

  • 授信范围(Trust Zones):两个相互之间高度互信的域名,如公司域名(corporate domains),不遵守同源策略的限制。
  • 端口:IE未将端口号加入到同源策略的组成部分之中,因此 http://company.com:81/index.html 和http://company.com/index.html 属于同源并且不受任何限制。

这些例外是非标准的,其它浏览器也未做出支持,但会助于开发基于window RT IE的应用程序。

变更源

页面可以改变本身的源,但会受到一些限制。脚本可以设置document.domain的值为当前域的一个后缀。

在同源策略中有一个例外,脚本可以设置document.domain的值为当前域的一个后缀,如果这样做的话,短的域将作为后续同源检测的依据。例如,假设在 http://store.company.com/dir/other.html 中的一个脚本执行了下列语句:

document.domain = "company.com";

这条语句执行之后,页面将会成功地通过对 http://company.com/dir/page.html 的同源检测。而同理,company.com 不能设置document.domain为 othercompany.com.

浏览器单独保存端口号。任何的赋值操作,包括document.domain = document.domain都会以 null 值覆盖掉原来的端口号。因此 company.com:8080 页面的脚本不能仅通过设置document.domain = "company.com"就能与 company.com 通信。赋值时必须带上端口号,以确保端口号不会为 null 。

附注:使用document.domain来安全是让子域访问其父域,需要同时将子域和父域的document.domain设置为相同的值。必须要这么做,即使是简单的将父域设置为其原来的值。没有这么做的话可能导致授权错误。

未经允许不得转载:SuperMan's blog » JavaScript 的同源策略

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址