google-chrome - 使用 Chrome 扩展删除所有 CSP 标头以允许 iframe
问题描述
我正在尝试创建一个 Chrome 扩展程序,它将 iframe 侧边栏注入任何页面。我遇到了一些使用 CSP 指令来限制可以框架的网站的问题(下面的示例是 LinkedIn)。我想我会尝试使用onBeforeSendHeaders来捕获所有content-security-policy
标题并删除它们,但我没有任何成功。
拒绝框架“ https://example.com/ ”,因为它违反了以下内容安全策略指令:“frame-src 'self' *.doubleclick.net www.slideshare.net radar.cedexis.com platform.linkedin.com media-exp1.licdn.com media-exp2.licdn.com mcexp1.licdn.com mcexp2.licdn.com media-lcdn.licdn.com mclcdn.licdn.com cdn.embedly.com https://www.linkedin.com lichat.azurewebsites.net www.youtube.com www.facebook.com player.vimeo.com embed.ted.com livestream.com embed.gettyimages.com w.soundcloud.com www.lynda.com media.licdn.com”。
这是我的清单文件:
{
"manifest_version": 2,
"name": "My Ext",
"description": "My ext desc",
"version": "0.1",
"content_scripts": [{
"matches": ["<all_urls>"],
"js": ["jquery-3.3.1.min.js","content.js","scripts.js"],
"css": ["content.css"]
}],
"background": {
"scripts": ["background.js"]
},
"permissions": ["tabs","activeTab","storage","webRequest","webRequestBlocking","<all_urls>"],
"browser_action": {
"default_icon": {
"16": "images/icon16.png",
"32": "images/icon32.png",
"48": "images/icon48.png",
"128": "images/icon128.png"
}
},
"icons": {
"16": "images/icon16.png",
"32": "images/icon32.png",
"48": "images/icon48.png",
"128": "images/icon128.png"
}
}
这是我的 background.js 中试图删除标题的代码:
chrome.webRequest.onBeforeSendHeaders.addListener(
function(details) {
console.log(details.requestHeaders);
for (var i = 0; i < details.requestHeaders.length; ++i) {
if (details.requestHeaders[i].name === 'content-security-policy') {
details.requestHeaders.splice(i, 1);
break;
}
}
return {requestHeaders: details.requestHeaders};
},
{urls: ["<all_urls>"]},
["blocking", "requestHeaders"]);
有什么想法我哪里出错了吗?
编辑:我还尝试了一种方法,onHeadersReceived
用于添加允许 example.com 的附加标头。我可以看到添加了标头,并且它阻止了另一个框架的加载,但是 example.com 仍然被拒绝-我假设是因为它仍然与前一个标头冲突?
该版本的清单是相同的,但这里是该版本的 background.js:
chrome.webRequest.onHeadersReceived.addListener(function(details) {
console.log(details.responseHeaders);
details.responseHeaders.push({
name: 'content-security-policy',
value: 'frame-src example.com'
});
return { responseHeaders: details.responseHeaders };
}, {
urls: ['*://*.linkedin.com/*']
}, [
"responseHeaders","blocking"
]);
这是内容和背景的控制台日志截图:
解决方案
推荐阅读
- swift - 在编辑模式下使用 DisclosureGroups 重新排列列表
- python - 如何使用 Foundry Nuke Python 解释器读取视频文件?
- ruby-on-rails - Sequel::DatabaseConnectionError: ODBC::Error: 01000 (0) [unixODBC][Driver Manager]Can't open lib 'libSnowflake.dylib'
- php - 检查特定键值是否出现在数组中 3 次
- python - 检查 os.listdir() 中的最后一个文件是否
- node.js - 猫鼬在 Model.InsertMany() 上超时;数据库未显示在 MongoDB shell 上
- python - 在 Python 中为词组添加前缀
- audio - 在 Web 应用中加载 iOS 上的多个音频文件
- flutter - 在火焰引擎中检测与屏幕底部的碰撞?
- json - 如何使用 Groovy 从 JSON 中删除内部方括号