【问题标题】:Refused to apply inline style because it violates the following Content Security Policy: "style-src 'self' https://apis.google.com.拒绝应用内联样式,因为它违反了以下内容安全政策:“style-src 'self' https://apis.google.com。
【发布时间】:2016-12-18 14:06:52
【问题描述】:

cb=gapi.loaded_0:formatted:2677

n.setAttribute("style", "position: absolute; width: 1px; height: 1px; left: -9999px;");

这是完整的消息:

拒绝应用内联样式,因为它违反了以下内容安全策略指令:“style-src 'self' https://apis.google.com'sha256-g1S9hiXQ4j0r+GB1Gi3NXXa9uB+5dR2H21SD7BToUKg='”。要启用内联执行,需要使用“unsafe-inline”关键字、哈希 ('sha256-WuACXZzzdKkWqck4qh4/nDEQy6ZpPTP0wGUXa/3oqT4=') 或随机数 ('nonce-...')。

我不想启用“不安全内联”。我有哪些选择?如上所示,我的 style-src 指令中似乎只能包含一个 sha1 哈希。但是,我得到了多个内联样式违规,每个违规都暗示了它自己的 sha1 哈希。可能是我使用了错误的语法来包含多个 sha1 哈希?有什么建议吗?

谢谢。

【问题讨论】:

  • 对了,不是sha1,是sha256。 CSP 还允许使用 sha384 或 sha512。
  • 是的。这是一个错字。

标签: google-signin


【解决方案1】:

问题不在于您只能指定一个哈希 - 这不是真的。您可以指定更多哈希值,例如

style-src 'self' 'sha256-g1S9hiXQ4j0r+GB1Gi3NXXa9uB+5dR2H21SD7BToUKg=' 'sha256-WuACXZzzdKkWqck4qh4/nDEQy6ZpPTP0wGUXa/3oqT4='

问题在于,至少某些浏览器(Chrome、Safari)仅将“shaXXX”规则应用于<style> 元素,而不是style 属性。见:https://bugs.chromium.org/p/chromium/issues/detail?id=546106

那么,有哪些选择?

  • 使用unsafe-inline(不推荐),
  • 重写代码以使用<style>标签并使用'shaXXX'或'nonce',
  • 使用单独的样式表(推荐)。

【讨论】:

  • 问题是 gapi.loaded_0 不是我的代码。这是谷歌的代码。所以,我不能使用你的建议(2)和(3)。我发现你可以添加更多的 sha256 哈希。但是,它会在代码中的其他地方使用另一个哈希生成相同的错误。
【解决方案2】:

我最终使用了他们的 OpenID Connect API,因为我不想使用 unsafe-inline。 (正确)实施更涉及。由于谷歌使用 iframe 注入他们的代码,我认为他们会使用 iframe 中的

【讨论】:

    猜你喜欢
    • 2017-11-13
    • 2020-12-15
    • 2017-11-26
    • 2013-07-19
    • 2018-07-02
    • 2021-05-10
    • 2015-09-26
    • 2016-04-23
    • 2013-07-13
    相关资源
    最近更新 更多