Chrome扩展程序 - 内容安全策略 - 执行内联代码

Ami*_*t G 18 google-chrome google-chrome-extension content-security-policy

我在chrome扩展中使用外部JavaScript库.我有内联执行,所以我得到了一些错误

(我在控制台上得到的错误)

拒绝执行JavaScript URL,因为它违反了以下内容安全策略指令:"script-src'self'chrome-extension://".要么是'unsafe-inline'关键字,哈希('sha256 -...'),要么是nonce('nonce -...')来启用内联执行.

错误消息清楚地表明有可能解决方法.

Chrome内容安全政策说不可能.许多相关问题引用了此链接.

博客这位博主说这是可能的,但可能这只适用于较旧的Chrome扩展程序.

任何可能的工作?

PS:不想/不能改变我正在使用的整个库.

编辑:如何使用哈希或随机数启用内联执行.

Xan*_*Xan 18

不,这是不可能放宽这项政策. unsafe-inline 自清单版本2以来,Chrome Extensions特别忽略了该功能.

文件(强调我的):

没有放松对执行内联JavaScript的限制的机制.特别是,设置包含"unsafe-inline"的脚本策略将不起作用.

错误消息提到了几种可能的方法,但文档清楚地表明没有CSP允许内联脚本,而忽略unsafe-inline只是其中一项措施.

更新

从Chrome 46开始,可以通过在策略中指定源代码的base64编码哈希来将内联脚本列入白名单.此哈希必须以使用的哈希算法(sha256,sha384或sha512)作为前缀.有关示例,请参阅元素的哈希用法.

有关白名单的详细信息,请参阅此答案.

  • +1; 向 OP 澄清:CSP 规范允许放宽此限制(因此建议添加 `unsafe-eval`),但是 Chrome 扩展允许在 CSP 中的范围比一般的 CSP 规范要窄。 (2认同)

Chr*_*unt 11

在这里复制了我对类似问题的回答.对于最新版本的Chrome(46+),目前的答案已不再适用.unsafe-inline仍然没有效果(在清单和meta标头标签中),但根据文档,您可以使用此处描述的技术来放宽限制.

<script>元素的哈希用法

script-src指令允许开发人员通过将其哈希指定为允许的脚本源来将特定内联脚本列入白名单.

用法很简单.服务器计算特定脚本块内容的哈希值,并在Content-Security-Policy头中包含该值的base64编码:

Content-Security-Policy: default-src 'self';
                     script-src 'self' https://example.com 'sha256-base64 encoded hash'
Run Code Online (Sandbox Code Playgroud)

例如,考虑:

manifest.json:

{
  "manifest_version": 2,
  "name": "csp test",
  "version": "1.0.0",
  "minimum_chrome_version": "46",
  "content_security_policy": "script-src 'self' 'sha256-WOdSzz11/3cpqOdrm89LBL2UPwEU9EhbDtMy2OciEhs='",
  "background": {
    "page": "background.html"
  }
}
Run Code Online (Sandbox Code Playgroud)

background.html:

<!DOCTYPE html>
<html>
  <head></head>
  <body>
    <script>alert('foo');</script>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

结果:
内联脚本的警告对话框

我还测试了将适用的指令放在meta标签而不是清单中.虽然控制台消息中指示的CSP确实包含了标记的内容,但它不会执行内联脚本(在Chrome 53中).

新的background.html:

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Security-Policy" content="script-src 'self' 'sha256-WOdSzz11/3cpqOdrm89LBL2UPwEU9EhbDtMy2OciEhs='">
  </head>
  <body>
    <script>alert('foo');</script>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

结果:
控制台有关内容安全策略的错误消息

  • 我得到一个“content_security_policy”:忽略指令“script-src”中的不安全 CSP 值“sha256-TTV2e1hDY8O7+uUJbANScTuJ3ibjGZ9SqN6LdxfzDCs=”。 (3认同)
  • 如何使用像<a href="javascript:void(0)"> Hello </a>这样的锚点href执行JS内联.我试过`rRMdkshZyJlCmDX27XnL7g3zXaxv7ei6Sg + yt4R3svU =`和`97l24HYIWEdSIQ8PoMHzpxiGCZuyBDXtN19RPKFsOgk =`没有运气. (2认同)

小智 11

你的代码中有这样的东西:

<button onclick="myFunction()"> Show password</button>
Run Code Online (Sandbox Code Playgroud)

简而言之,这在 chrome 应用程序和扩展程序中是不允许的。

将其更改为以下内容,它将起作用:

html:

<button id="myButton"> Show password</button>
<script src="script.js"></script>
Run Code Online (Sandbox Code Playgroud)

脚本.js:

document.getElementById("myButton").addEventListener("click", myFunction); function myFunction(){ console.log('asd'); }

很长的故事:

在 chrome 应用程序中,内容安全策略不允许内联 javascript。所以你必须把你的 javascript 放在一个 .js 文件中,并将它包含在你的 HTML 中。

进一步阅读:https : //developer.chrome.com/extensions/contentSecurityPolicy


小智 6

Chrome 扩展程序会特别忽略nonce ,因为它不安全。截至 2020 年 9 月 (v.85),只有“ sha256.. ”选项有效。但很不方便,因为哈希值会随着每次 html 文件更新而变化。

  • 你能展示一个 sha256 的例子吗?我知道它也是无效的。 (4认同)