同源策略(Same Origin Policy)是一个很重要的安全理念,是客户端脚本的重要的安全度量标准,其目的是防止某个文档或脚本从多个不同源进行装载。

根据这个策略,a.com域名下的JavaScript无法跨域操作b.com域名下的对象。比如,baidu.com域名下的页面中包含的JavaScript代码,不能访问google.com域名下的页面内容。

JavaScript必须严格遵循浏览器的同源策略,包括Ajax(事实上,Ajax也是由JavaScript组成)。通过XMLHttpRequest对象实现的Ajax请求,不能向不同的域提交,比如,在abc.test.com下的页面,不能向def.test.com提交Ajax请求。

这里的"同源"指的是同协议、同域名和同端口。表5-3中列举的例子能更具体地说明这一点。

wKiom1Qg0IWQ-QtnAAFiFAiWUxE053.jpg

从第二行开始,网站之间的通信会受到同源策略影响,如http://www.a.com/a.jshttp://www.a.com:8080/b.js的端口不一致,所以之间不能通信;http://www.a.com/a.jshttps://www.a.com/b.js分别使用了HTTP和HTTPS协议,HTTP、HTTPS、FTP等是属于不同的协议,所以也不能通信;而http://www.a.com/a.jshttp://test.a.com/b.js虽然是相同顶级域名,但二级域名不同,所以也是不行的。

由此可见,同源策略认为来自其他任何站点的装载内容都是不安全的,如图5-11所示。

wKioL1Qg0OyTaK3RAADFNUWPbo4451.jpg

这个限制十分重要。假设***者利用Iframe把真正的银行登录页面嵌到他的页面上,当用户使用真实的用户名、密码登录时,该页面就可以通过JavaScript读取到用户表单中的内容,这样用户名和密码信息就被泄漏了。

而运用了同源安全策略后,用户就能确保自己正在查看的页面确实来自于正在浏览的域。

然而,受到同源策略的影响,跨域资源共享就会受到制约。当进行一些比较深入的前端编程的时候,不可避免地需要进行跨域操作,这时候同源策略就显得过于苛刻。于是,开发者就想出各种各样的跨域方法,比如使用JSONP、Iframe、Flash等。虽然跨域技术能带来更多的功能,但是功能的开放也意味着安全的风险。

即便是有了浏览器沙箱和同源策略的保护,用户依然会受到***的各种***,XSS跨站脚本就是最大的威胁之一。


内容来源:http://book.51cto.com/art/201311/419359.htm