我有一个Chrome扩展程序,可以在浮动iframe的页面中添加一个面板(点击扩展按钮)。从第三方主机下载的某些JS代码需要在该页面上执行。显然,XSS的问题和扩展需要遵守该页面的内容安全策略。
以前我必须处理通过请求标头传递的CSP指令,并且能够通过在chrome.webRequest.onHeadersReceived
中设置挂钩来覆盖这些指令。在那里,我将主机网址添加到content-security-policy
标头中。有效。标题被替换,新的指令应用于页面,一切都很好。
现在我发现了通过<meta>
标记设置CSP指令的网站,他们不使用请求标头。例如,iTunes https://itunes.apple.com/us/app/olympics/id808794344?mt=8中的应用页面就是这样的。还有一个名为web-experience-app/config/environment
(?)的附加元标记,它稍微复制了使用http-equiv="Content-Security-Policy"
标记内容中设置的值。
这次我尝试将我的主机名添加到chrome.webNavigation.onCommitted
或onCompleted
事件监听器(JS vanilla via chrome.tabs.executeScript
)中的元标记中。我还尝试从webrequest的onCompleted
监听器运行相同的代码(根据https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/webRequest生命周期的最后一步)。
当我在加载后检查页面时 - 我看到元标记已更改。但是当我点击我的扩展程序开始加载iframe并执行JS时 - 控制台会输出以下错误:
Refused to frame 'https://myhost.com' because it violates the following Content Security Policy directive: "frame-src 'self' *.apple.com itmss: itms-appss: itms-bookss: itms-itunesus: itms-messagess: itms-podcasts: itms-watchs: macappstores: musics: apple-musics:".
即。我的标签更新无效。
我有几个问题:首先,我做得对吗?我是否在正确的活动中进行更新?何时在页面生命周期中读取元标记的数据内容?标签内容更改后会自动应用吗?
答案 0 :(得分:0)
截至2018年3月,Chromium不允许修改请求的responseBody。 https://bugs.chromium.org/p/chromium/issues/detail?id=487422#c29
“WebRequest API:允许读取响应主体的扩展”是从2015年开始的一张票。它不是一个需要解决的路径,需要一些工作/帮助。
-
Firefox具有webRequest过滤器实现,允许在应用页面的元指令之前修改响应主体。 https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/webRequest/filterResponseData 但是,我的问题主要集中在修复Chrome扩展程序。也许Chrome有一天会选择这个。
-
总的来说,Chrome的扩展构建框架似乎不是构建长期生活软件的可靠途径;浏览器供应商经常更改规则,对新发现的威胁做出反应,没有最新支持的跨浏览器标准。
-
就我而言,围绕这个问题的可能方法是将所有JS代码抛出到扩展的源代码库中。这样就没有第三方连接到获取和执行JS(并与/违反CSP规则冲突)。还没有探索过这个,因为我希望重用代码&amp;我在主浏览器应用程序中使用的交互式组件。