同源策略的含义详解
- 含义一(DOM层面的同源策略):限制了来自不同的”document”对象或js脚本,对当前“document”对象的读取或设置某些属性;
- 含义二(Cookie和XMLHttprequest层面的同源策略):只有和本网页同源的脚本才会被执行,有时,AJAX已经加载不同源的脚本,但绝对不会被执行;
- 含义三(同源策略的非绝对性):同源策略通常允许进行跨域写操作、通常允许跨域资源嵌入、通常不允许跨域读操作;
<script><img><iframe><link><video><audio>
等带有src属性的标签可以从不同的域加载和执行资源,同源策略关注的是加载js的页面所在的域,而不是页面内存放的js文件的域; - 含义四(其他插件的同源策略):flash、java applet、silverlight、googlegears等浏览器加载的第三方插件也有各自的同源策略,只是这些同源策略不属于浏览器原生的同源策略,如果有漏洞则可能被黑客利用,从而留下XSS攻击的后患;
几个同源策略常见问题
1、没有同源策略会怎样?为什么同源策略禁止跨域读操作?
设想你打开了一个银行网站,又打开了一个恶意网站,如果没有同源策略,将会:
恶意网站包含了脚本a.js,银行网站在没有加载此脚本的情况下,就可以被此脚本操纵,操纵的后果是:
- 银行网站页面DOM结构被篡改;
- 银行网站页面DOM元素的属性和值被篡改;
- 银行页面发送的表单信息可能被恶意脚本接收到,造成用户名密码泄漏;
- 恶意网站通过自己加载的恶意js脚本获取了银行网站用户的cookie信息,并将它发送给了银行网站,随后,恶意网站就可以自动的、不受用户限制的、在用户不知情的情况下登录用户的银行网站并且伪装用户发送转账等请求;
2、有了同源策略会怎样?
浏览器在执行一个js脚本(或其他脚本)前,需要对这个脚本进行同源检测,如果加载这个脚本的页面和当前页面不同源,浏览器将拒绝执行此脚本;注意,浏览器并不关心js脚本来自何方(不关心js脚本从哪个域名、哪个”源”加载),它只关心加载脚本的那个页面是否和当前页面同源;
3、为什么<script><img><iframe><link><video><audio>等带有src属性的标签可以不遵守同源策略/为什么同源策略允许跨域嵌入:
- 现在很多大型网站的js脚本、图片等都不是存放在存储网站页面的那台服务器上,他们很可能通过CDN等方式传送到浏览器端,如果限制他们必须和网站页面同源,无异于自己束缚手脚;
- 一个网站要加载哪些脚本,由网站的编写人员说了算,他们不会故意加载恶意脚本(比如银行网站的编写人员不会将恶意网站的脚本写在银行网站中),所以只要是写在网页中的脚本,我们认为它是安全的;
- 所以,a.com的网页中可以写<script src="b.js"></script>,a网站加载了b网站的脚本,这是完全可以的,不受任何限制;
可以这样认为,只要是页面加载的脚本,都和页面同源,无论这个脚本来自哪个”源”(source);
4、为什么同源策略允许跨域写操作?
和上面一条理解相同;比如提交表单这个写操作,表单不一定提交到提供网页页面的网站,很有可能提交到专门处理表单的服务器,如果不允许跨域写,将是很不灵活的;表单提交到什么地方,是编写页面时程序员决定,程序员不可能故意写一个恶意域名进去,所以写操作通常是安全的。
5、“同源”的具体含义?
网站的同源:域名、协议、端口有一个不同就不是同源,三者均相同,这两个网站才是同源;
js脚本的同源:处于同源网站上的js脚本同源,否则不同源。
网友评论