代码改变世界

同源策略

2010-11-12 11:28  子冬  阅读(243)  评论(0编辑  收藏  举报

这个策略可以追溯到 Netscape Navigator 2.0,Mozilla 认为两个页面拥有相同的源,那么它们的协议、端口(如果指明了的话)和主机名都相同。在客户端编程语言中,如JavaScript和ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义。同源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问和操作另外一个域的绝大部分属性和方法。那么什么叫相同域,什么叫不同的域呢?当两个域具有相同的协议(如http), 相同的端口(如80),相同的host(如www.compony.com),那么我们就可以认为它们是相同的域。 下表给出了相对http://www.company.com/dir/page.html同源检测的结果: URL 结果 原因 http://store.company.com/dir2/other.html 成功 http://store.company.com/dir/inner/another.html 成功 https://store.company.com/secure.html 失败 协议不同 http://store.company.com:81/dir/etc.html 失败 端口不同 http://news.company.com/dir/other.html 失败 主机名不同 在同源策略中有一个例外,脚本可以设置 document.domain 的值为当前域的一个后缀,比如域store.company.com的后缀可以是company.com。如果这样做的话,短的域将作为后续同源检测的依据。例如,假设在 http://store.company.com/dir/other.html 中的一个脚本执行了下列语句: document.domain = "company.com"; 这条语句执行之后,页面将会成功地通过对 http://company.com/dir/page.html 的同源检测。而同理,example.com 不能设置 document.domain 为 othercompany.com. 同源策略还应该对一些特殊情况做处理,比如限制file协议下脚本的访问权限。本地的HTML文件在浏览器中是通过file协议打开的,如果脚本能通过file协议访问到硬盘上其它任意文件,就会出现安全隐患,目前IE8还有这样的隐患。