【问题标题】:Content-Security-Policy object-src blob内容-安全-策略对象-src blob
【发布时间】:2015-04-12 14:48:52
【问题描述】:

当使用 content-security-policy 时,我尝试使用 window.URL.createObjectURL 在 Chrome 41(测试版)中遵循流程,我收到如下错误:

拒绝从“blob:http%3A//localhost%3A7000/f59612b8-c760-43a4-98cd-fe2a44648393”加载插件数据,因为它违反了以下内容安全策略指令:“object-src blob://* "

使用限制 object-src 或其他 default-src 的内容安全策略,可以像这样重现问题(使用 jQuery 方便):

blob = new Blob(
   ["%PDF-1.\ntrailer<</Root<</Pages<</Kids[<</MediaBox[0 0 3 3]>>]>>>>>>"],
   { type: "application/pdf" })
$("<embed>").attr("src", window.URL.createObjectURL(blob))
  .appendTo(document.body)

它似乎来自the spec that this should work,就像它对data://* 一样。我也试过blobblob:blob:*blob:http*blob:http:*blob:http://*,但无济于事。

object-src * 有效,但出于明显的原因是不可取的。

有没有人通过内容安全策略成功地让 Blob 加载?这是上游的问题,还是我忽略了什么?

【问题讨论】:

    标签: google-chrome blob content-security-policy


    【解决方案1】:

    符合规范的答案是object-src 'self' blob:

    blob: 应该只明确匹配blob:,而不是'self'*。这是Chrome 中的一个错误,最近在Firefox 40 中修复。

    【讨论】:

      【解决方案2】:

      对于 Chrome 47.0.2526.73:

      default-src blob:;

      为我工作

      【讨论】:

      • 如果默认情况下允许每个域,为什么还需要 CSP?
      • 正如 Joao 指出的那样这基本上完全使 CSP 无效。如果您没有明确定义所有其他规则,例如connect-srcframe-src 等,很可能给定there's 16 of them,则将应用此default-src *。这意味着例如,在您的页面中注入脚本的黑客将能够运行来自任何其他域的代码。 object-src 'self' blob: 是更好的选择,如果您不想获得更精细但仍提供一定程度的安全性
      • 根本不设置 CSP,而不是设置这样的东西。
      • 这看起来像是在他们的网站上运行表面安全扫描后勾选“发送 CSP 标头”框。也可以解释赞成票。
      猜你喜欢
      • 2017-03-14
      • 2016-03-25
      • 2018-02-14
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-08
      • 2018-08-14
      相关资源
      最近更新 更多