【问题标题】:content security policy issue with chrome extensionchrome 扩展的内容安全策略问题
【发布时间】:2013-12-23 19:04:06
【问题描述】:

尝试通过 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)
}

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

从拒绝到负载插件数据 '的数据:应用程序/ PDF格式; BASE64,JVBERi0xLjQNCiXi48 / TDQoxIDAgb2JqDQo8PA0KL1R5cGU ... mRvYmoNCjkgMCBvYmoNCjw8DQovVHlwZSAvRm9udA0KL1N1YnR5cGUgL1R5cGUxDQovQmFzZUZ',因为它违反了以下内容安全政策指令:“默认-SRC '自我' STRONG>

但令人惊讶的是,当数据 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:application/pdf;base64' 加载插件数据,因为它违反了以下内容安全策略指令:“object-src 'self'

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

【问题讨论】:

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


    【解决方案1】:

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

    请注意,script-src 和 object-src 都是由策略定义的。 Chrome 不会接受不将这些值中的每一个都限制为(至少)“self”的政策。

    无法放宽您扩展的 CSP 以接受 PDF。
    但是...

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

    【讨论】:

    • 但是 CSP 如何允许在数据 URI 方案中使用图像类型,就像我使用的那样:'data:image/png;base64,成功。它是依赖于 MIME 类型还是其他?
    • @user3074358 data:application/pdf,.. 导致尝试通过插件(对象)加载内容,而 data:image/png, 只是一个图像。如果您还想屏蔽 data:image/png,请将 frame-src 'self' 添加到您的 CSP。
    • 好的,我尝试使用沙盒方式加载 pdf。在沙盒 html 中创建了一个 iframe,并在运行时通过非沙盒页面和沙盒页面之间的通信为该 iframe 创建了源。现在控制台窗口中没有错误,但由于某些原因,pdf 在框架中不可见。此外,如果我选择“检查元素”并转到创建的 iframe 并单击链接(即“数据:应用程序/pdf” ;base64,' + data) 在它的 'src' 标签前面,然后 pdf 在新标签页中打开。我已经检查了 chrome://plugins 以查看是否启用了 pdf 查看器。
    • 奇数。我建议使用 PDF.js 嵌入 PDF。然后您还可以确定 PDF 将始终以内联方式查看(只有 Chrome 具有内置的 PDF 查看器)。
    • 嗯,我需要在 UI 上显示各种内容,所以它不仅仅是 PDF。内容可以是 PDF、SWF 等,所以我希望它应该运行(即提供不同的 mime 类型对于不同的内容加上 iframe src 的 base64 编码字符串。),但不确定发生了什么问题。除此之外,我还尝试在运行时在 html 中添加一个“嵌入”元素,而不是 iframe: ,但结果还是一样。
    猜你喜欢
    • 2013-02-01
    • 2021-09-24
    • 2020-02-28
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 2014-10-26
    • 2021-01-11
    • 2012-09-10
    相关资源
    最近更新 更多