据我所知,扩展中有两种类型的脚本,一种是“内容脚本”,它们在网页中运行,并与网页中的DOM交互,这些脚本由相同的源策略管理;另一个是脚本,称之为“扩展脚本”,它们在后台运行,可能会也可能不会与网页交互,例如Firefox或中的 main.js Chrome中的background.js 。以下是Google对扩展程序脚本的解释
“...有一个长时间运行的脚本来管理某个任务或状态......后台页面是一个在扩展过程中运行的HTML页面。它存在于您的扩展的生命周期中,并且只有一个实例它一次是活跃的“
所以问题是,同源策略如何应用于“扩展脚本”?为什么要这样,因为这些脚本独立于正在浏览的网页上的内容?无论如何,扩展脚本的域是什么? (谷歌说"extension attempts to use a security origin other than itself",但没有明确说明原点是什么。)
可以在扩展程序中完成以下操作吗?
示例一:从时间服务器获取时间,并将其显示在附加栏上。
示例二:一个扩展程序,用于检查来自任意域(或已添加书签但已关闭的页面)的最近关闭的页面是否已更新,并提醒用户是否存在。
我知道Chrome中的跨域HTTP和Ftp请求可以在声明权限后使用XMLHttpRequest完成Http:// * /。但是Firefox呢?那些其他协议呢,比如smtp,ppp等?
HTML5中的WebSocket,在扩展脚本中使用,是否受同域策略的束缚?
答案 0 :(得分:1)
Chrome扩展程序(包含的背景页面)仅限于与常规网页相同的原始政策。但是,您可以在Chrome应用或扩展程序的清单中请求跨源权限,以便您的XHR成功。因此,您应该能够使用此方案执行示例1。我不确定你怎么能做上面的例子。
在您的扩展程序的manifest.json中:
"permissions": [
"http://www.google.com/"
],
我会让其他人回答关于Firefox的问题。
答案 1 :(得分:1)
Firefox有两种类型的扩展:传统叠加扩展和新的附加SDK扩展。
叠加扩展程序不受相同的原始策略的约束,例如以下jQuery代码对我有用:
$.get("http://www.example.org", function() { /* do something */ } );
但是对于新的附加SDK扩展,情况与Google Chrome扩展程序几乎相同:“扩展程序脚本”受同一来源政策的限制并且您可以使用cross-domain-content属性
将package.json中的域列入白名单"permissions": {
"cross-domain-content": ["http://example.org/", "http://example.com/"]
}
此属性中不允许使用通配符。您必须请求特定域,如MDN网站上所写:
列出的域名必须包含方案和完全限定的域名,这些域名必须与提供内容的域名完全匹配...
因此,对于您的示例,他们将在相同的原始政策上失败。如果可能的话,您必须编写覆盖扩展,或使用CORS,JSONP或other techniques来绕过它。