javascript - Chrome 扩展的内容安全策略问题

标签 javascript google-chrome google-chrome-extension content-security-policy

尝试在 chrome 扩展应用程序中通过 javascript 在“iframe”中加载不同的内容(可以是 pdf、swf 等)。使用数据 URL 方案加载内容:

//此 javascript 在 html 文件中注册,并且 LoadFunction 在单击按钮时在 DOMContentLoaded 事件中注册。

void LoadFunction()
{
window.parent.document.getElementById("page_data").src = 'data:application/pdf;base64,'    + 'base64 encoded data'; (base64 data is received from a c++ class)
}

但是一旦调用上述函数,就会引发内容安全策略错误:

Refused to load plugin data from 'data:application/pdf;base64,JVBERi0xLjQNCiXi48/TDQoxIDAgb2JqDQo8PA0KL1R5cGU…mRvYmoNCjkgMCBvYmoNCjw8DQovVHlwZSAvRm9udA0KL1N1YnR5cGUgL1R5cGUxDQovQmFzZUZ' because it violates the following Content Security Policy directive: "default-src 'self'

但令人惊讶的是,当数据 url 更改为:'data:image/png;base64,' + 'base64 encoded data'; 时不会引发此错误;图像成功加载到 iframe 中。

据我所知,仅当直接在 html 文件中执行内联代码时才会引发此错误,但这里不是这种情况,如果是这种情况,那么为什么它不会针对图像文件引发。

此外,如果我尝试将 manifest.json 文件中的内容安全策略设置为: "content_security_policy": "script-src 'self'; object-src 'self' ; frame-src 'self' data:"

然后错误变为: 拒绝从“data:application/pdf;base64”加载插件数据,因为它违反了以下内容安全策略指令:“object-src 'self'”

所以可能需要设置 object-src,但不确定它应该是什么。

最佳答案

根据 Chrome 扩展的文档 Content Security Policy ,

Note that both script-src and object-src are defined by the policy. Chrome will not accept a policy that doesn't limit each of these values to (at least) 'self'.

不可能放宽扩展的 CSP 以接受 PDF。
但是...

你可以定义一个sandboxed extension resource ,即您的扩展中不受扩展的 CSP 影响的页面。同时,该页面将失去对 Chrome 扩展 API 的访问权限,以防止页面中存在安全漏洞。如果您希望在您的扩展程序和沙盒页面之间进行通信,请使用 postMessage - 例如如 Using eval in Chrome Extensions. Safely. 所示.

关于javascript - Chrome 扩展的内容安全策略问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20423733/

相关文章:

macos - 在 Mac 操作系统上从 sqlite db 解密 chrome cookie

google-chrome - 缓存控制响应 header 不强制浏览器缓存

javascript - GWT : User Location

javascript - 谷歌浏览器扩展和 Twilio 客户端 API

javascript - 居中多个项目

google-chrome-extension - 无法调用未定义的 chrome 扩展的方法 'create'

google-chrome-extension - 除了 Google 电子钱包之外,还有其他方法可以一次性支付 5 美元制作 Chrome 扩展程序的费用吗?

html - 尝试在谷歌浏览器中使用 HTML5 文件 api 时出现 FileError

JavaScript: void(0), IE6, SWFAddress

javascript - 基于 JavaScript 中的另一个下拉菜单创建一个新的下拉菜单