尝试在 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/