Chrome MV3扩展:为何未声明web_accessible_resource的CSS/JS可被访问?
为什么未声明的CSS/JS能被iframe中的sample.html访问?
这是因为iframe的运行上下文不同:
- 当你通过
chrome.runtime.getURL('/iframeinjector/sample.html')注入iframe时,这个iframe的文档本质上属于你的扩展的独立origin(上下文),而非用户正在浏览的宿主页面。 - sample.html里引用的CSS/JS使用相对路径,这些资源请求是从扩展自身的上下文发起的,直接读取扩展包内的文件,不需要经过宿主页面的权限校验——所以它们不需要被声明在
web_accessible_resources里。
关于web_accessible_resources的本质
web_accessible_resources的核心作用是允许**宿主页面(用户的网页)**直接访问扩展内的资源。比如:
- 宿主页面的脚本想加载扩展的图片
- 宿主页面的样式想引用扩展的字体
- 你在content script里给宿主页面的DOM添加了指向扩展资源的链接
这些场景下,请求是从宿主页面上下文发起的,必须把对应的资源声明到web_accessible_resources中,否则会被浏览器拦截。
而你的场景里,CSS/JS是被扩展自己的iframe加载的,属于扩展内部的资源访问,完全不受web_accessible_resources的限制——你只需要确保作为iframe入口的sample.html被声明即可,因为加载这个HTML的请求是从宿主页面上下文发起的(注入iframe时的src请求)。
验证方式
如果你想测试这个逻辑,可以尝试:
- 在content script里直接给宿主页面的
<head>添加一个<link>标签,指向你的bootstrap/built.min.css的chrome.runtime.getURL地址 - 此时浏览器会拦截这个请求,因为该CSS未被声明在
web_accessible_resources中——这才是需要声明的场景。
内容的提问来源于stack exchange,提问作者Kritidipto Ghosh
相关产品推荐
相关产品推荐

