当前位置: 首页 > 知识库问答 >
问题:

将iframe注入具有限制性内容安全策略的页面

谢建业
2023-03-14

我想创建一个浏览器扩展,它创建一个侧栏。Chrome没有一流的侧边栏,所以我们必须在页面中添加iframe。但是,由于内容安全策略,这在许多页面上会中断。例如。GitHub使用CSP,它不允许将来自其他站点的IFRAME嵌入其中。例如。如果您尝试将CapitalOne.com网站放在GitHub的iframe中,您会得到以下信息:

拒绝对“https://www.capitalone.com/”进行帧处理,因为它违反了以下内容安全策略指令:“frame-src'self'render.githubusercontent.com www.youtube.com assets.braintreegateway.com”。

下面是一个简单的浏览器扩展来再现这一点:

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
  if (changeInfo.status === 'complete') {
   chrome.tabs.executeScript(tabId, { code: 'document.body.innerHTML=\'<iframe style=\"width:600px; height:600px\" src=\"https://www.capitalone.com/\"></iframe>\' + document.body.innerHTML;' }, function() {
     console.log('Iframe injection complete');
   })
  }
}.bind(this));

然而,根据维基百科的说法,浏览器扩展应该能够注入iframe,尽管有任何内容安全策略:

根据CSP处理模型,[20]CSP不应干扰用户安装的浏览器加载项或扩展的操作。CSP的这一特性有效地允许任何插件或扩展将脚本注入到网站中,而不管该脚本的来源如何,因此不受CSP策略的约束。

除了我现在做的以外,还有什么其他方法可以注射iframe吗?

共有1个答案

席成仁
2023-03-14

无法在Chrome中插入外部iframe是一个错误(crbug.com/408932)。

如果你想在一个外部网站中嵌入一个外部框架,那么它必须加载在一个与你的扩展打包的框架中。

{
    "name": "Embed external site",
    "version": "1",
    "manifest_version": 2,
    "content_scripts": [{
        "js": ["contentscript.js"],
        "matches": ["*://*/*"],
        "all_frames": true
    }],
    "web_accessible_resources": [
        "frame.html"
    ]
}

如果希望始终在文档中插入内容脚本,请不要使用chrome.tabs.onupdated+chrome.tabs.executescript。您的实现有缺陷,可能会导致脚本多次运行。相反,您应该在清单文件中声明内容脚本。

(如果不想在每个子帧中插入帧,请删除“all_frames”:true。)

// Avoid recursive frame insertion...
var extensionOrigin = 'chrome-extension://' + chrome.runtime.id;
if (!location.ancestorOrigins.contains(extensionOrigin)) {
    var iframe = document.createElement('iframe');
    // Must be declared at web_accessible_resources in manifest.json
    iframe.src = chrome.runtime.getURL('frame.html');

    // Some styles for a fancy sidebar
    iframe.style.cssText = 'position:fixed;top:0;left:0;display:block;' +
                           'width:300px;height:100%;z-index:1000;';
    document.body.appendChild(iframe);
}
<style>
html, body, iframe, h2 {
    margin: 0;
    border: 0;
    padding: 0;
    display: block;
    width: 100vw;
    height: 100vh;
    background: white;
    color: black;
}
h2 {
    height: 50px;
    font-size: 20px;
}
iframe {
    height: calc(100vh - 50px);
}
</style>
<h2>Displaying https://robwu.nl in a frame</h2>
<iframe src="https://robwu.nl/"></iframe>

注意到我在框架中加载了一个https站点是很重要的。如果您试图加载帧中的HTTP站点,那么如果父帧之一是https页,则混合内容策略将阻止加载帧。

https://robwu.nl/替换为http://example.com/,在https://github.com等https页面上,框架将保持空白。同时,以下消息将打印到控制台。

[blocked]“HTTPS://github.com/”上的页面通过HTTPS加载,但从“http://example.com/”运行了不安全的内容:此内容也应通过HTTPS加载

 类似资料:
  • 所以我一直在尝试使用一个谷歌可编程搜索引擎脚本,但我在元标记方面遇到了问题。我在my中包含的meta标记如下所示: 但是,我仍然收到一个错误,告诉我它拒绝加载脚本,因为它违反了“内容安全策略指令:“script src'self'” 我想知道它是否从其他地方继承了一些设置,因为它不接受我正在设置的新脚本src,但是如果我将其设置为“无”,它会接受新脚本src。 顺便说一下,我对html非常陌生,所

  • 内容安全策略 CSP(Content Security Policy)即内容安全策略,主要目标是减少、并有效报告 XSS 攻击,其实质就是让开发者定制一份白名单,告诉浏览器允许加载、执行的外部资源。即使攻击者能够发现可从中注入脚本的漏洞,由于脚本不在白名单之列,浏览器也不会执行该脚本,从而降低客户端遭受 XSS 攻击风险。 默认配置下,CSP 甚至不允许执行内联代码 (<script> 块内容,内

  • CSP(内容安全策略) CSP(Content Security Policy) 即内容安全策略,主要目标是减少、并有效报告 XSS 攻击,其实质就是让开发者定制一份白名单,告诉浏览器允许加载、执行的外部资源。即使攻击者能够发现可从中注入脚本的漏洞,由于脚本不在白名单之列,浏览器也不会执行该脚本,从而达到了降低客户端遭受 XSS 攻击风险和影响的目的。 默认配置下,CSP 甚至不允许执行内联代码

  • 在我的页面上,我给出了层次结构: 内部框架带有给定的标题 看起来一切都是正确的,但我在chrome中遇到了这样的错误(ff中也有错误): 拒绝展示https://app.domain.training/path'在帧中,因为祖先违反以下内容安全策略指令:“帧祖先app.domain.training proxy.domain.training domain.training*.domain.tra

  • 问题内容: 我在开发人员控制台中收到很多错误: 拒绝评估字符串 拒绝执行内联脚本,因为它违反了以下内容安全策略指令 拒绝加载脚本 拒绝加载样式表 这是怎么回事?内容安全策略如何工作?如何使用HTTP标头? 具体来说,如何… …允许多个来源? …使用不同的指令? …使用多个指令? …处理端口? …处理不同的协议? …允许的协议? …使用内联样式,脚本和标签以及? …允许吗? 最后: 到底是什么意思?

  • 我正在从chargebee.com加载外部脚本,并在控制台中收到此错误消息: [仅报告]拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script src'nonce VVZ V0c=''self'https://maps.googleapis.com https://domain.chargebeestatic.com http://dgkxwewtzsnml.cloudfront.ne