一、什么是同源策略
同源策略,是由Netscape提出的一个著名的安全策略,现在所有支持javascript的浏览器都会使用这个策略。
为什么需要同源策略,这里举个例子:
假设在浏览器的一个tab窗口中打开了银行网站,在另外一个tab窗口中打开了一个恶意网站,而那个恶意网站引入了一个javascript脚本。如果没有同源策略,那么这个脚本就可以获取或篡改银行网站上的信息
同源策略是由浏览器来实现的。浏览器在执行一个javascript脚本之前,首先会负责进行“同源检查”,如果javascript和页面不是同源的,浏览器就会拒绝执行这个javascript脚本
二、chrome extension违反了同源策略吗
function click(e) { chrome.tabs.executeScript(null, { code : "document.body.style.backgroundColor='red'" }); window.close(); }
上述js代码,在点击chrome扩展中的一个按钮时,会改变当前TAB页面里的背景颜色
利用chrome.tabs.executeScript()方法,还可以做很多事情,当然也包括获取document里的信息
看起来,chrome extension违反了同源策略
但是实际上并不是这样,chrome通过2个层面来保证安全
首先chrome扩展是需要通过google审查的,并不是随意发布的,所以比来路不明的javascript安全
其次,在开发chrome extension时,需要在manifest文件中进行权限声明:
"permissions": [ "tabs", "notifications", "http://localhost:8080/", "http://www.baidu.com/" ]
因此,在用户选择安装这个extensions时,就会给出警告,类似于android上的权限声明机制
所以,chrome extensions并不是违反javascript同源策略的
3、chrome.tabs、chrome.windows、document、window
这几个概念有点混淆,顺便在此澄清一下
document和window是javascript里特有的概念,不是浏览器特有的
window是窗口,document是窗口里加载的文档模型(DOM)
详细的介绍,可以看这篇文章:
http://eligeske.com/jquery/what-is-the-difference-between-document-and-window-objects-2/
在具体的浏览器实现里,则有windows和tabs的区别
很早以前(IE6之前),浏览器的一个窗口只能打开一个网页;现在基本所有的浏览器都支持TAB了
chrome也提供了API,来控制windows和tabs,分别是chrome.windows和chrome.tabs
4、扩展和插件(extensions and plugins)
扩展和插件不同
扩展主要用javascript开发,可以用chrome://extensions管理
插件用NPAPI开发,语言是C++,可以用chrome://plugins管理