【问题标题】:Chrome Extension CSP - unsafe-eval and unsafe-inline in 3rd party js library and stylesheetChrome 扩展 CSP - 3rd 方 js 库和样式表中的 unsafe-eval 和 unsafe-inline
【发布时间】:2021-01-06 22:49:18
【问题描述】:

浏览器 - Chrome 版本 85.0.4183.102

围绕这个主题有很多线程,但我找不到处理 3rd 方库的最安全和正确的方法。 我在我的 chrome 扩展中使用剑道网格(jQuery)。它有“unsafe-eval”和“unsafe-inline”......除非我在 manifest.json 中设置以下条目,否则它不起作用。

"content_security_policy": "font-src data:; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-eval'; object-src 'self';"

由于它不是最安全的做法.. 我怎样才能用哈希或随机数绕过它。

注意:剑道库是从本地机器下载和引用的。 (没有 CDN 引用)

'不安全线'

当我按预期删除“unsafe-inline”时,它会在我的情况下给出 5 个错误并提供 5 个不同的 sha-256 哈希值。我用 5 个哈希替换了“unsafe-inline”,但仍然出现相同的错误。

以下是我仅尝试使用 1 个哈希时的错误。

拒绝应用内联样式,因为它违反了以下内容安全策略指令:“style-src 'self' 'sha256-lzhPGNqxpwmBda/ftMrdga7dSTDWPq2rpjz66R6TVFw='”。启用内联执行需要“unsafe-inline”关键字、哈希(“sha256-lzhPGNqxpwmBda/ftMrdga7dSTDWPq2rpjz66R6TVFw=”)或随机数(“nonce-...”)。

'不安全评估'

当我按预期删除“unsafe-eval”时,会给出没有生成的哈希值替换的错误。

'font-src 数据:'

尚未尝试绕过。

我什至尝试过 nonce,但没有奏效。

我错过了什么吗?还是我需要忍受'unsafe-inline'和'unsafe-eval'。如果是,潜在风险是什么?我计划向公众发布这个扩展。

编辑:我按照下面的建议尝试了沙盒。

这就是我所做的。

index.html

<html>
    <head>
        <link href="css/iframe.css" rel="stylesheet">
    </head>
    <body>
        <iframe id="iframe" src="sandbox.html"></iframe>
    </body>
</html>

sandbox.html 有剑道参考&lt;script src="js/kendo.all.min.js"&gt;&lt;/script&gt;

这里是 manifest.json 的变化

"sandbox": {
"pages:": [
  "sandbox.html"
]},"content_security_policy": "sandbox allow-scripts allow-same-origin allow-popups;"

我仍然在使用剑道时遇到错误。有什么建议吗?

【问题讨论】:

  • 假设您无法摆脱这些 eval,从纯粹意义上说,唯一安全的方法是使用 sandbox 中的库。
  • 感谢沙盒建议。我试过但仍然出错..请参阅上面的编辑部分。
  • 查看文档中链接的example,它不会修改CSP。
  • 添加或不添加 CSP 指令都没有关系。它不工作。
  • 好吧,从那个演示扩展开始,在那里添加你的文件,看看它是否有效,然后将它调整到你的主扩展。

标签: google-chrome-extension kendo-grid content-security-policy


【解决方案1】:

脚本和样式中的“不安全内联”

Chrome 无意中用 hashes 误导了您的内联样式。内联脚本的哈希也是如此:

  1. &lt;script&gt;...&lt;/script&gt; consiedres 作为内联并且可以与 'nonce-value' 或/和 'hash-value' 标记一起使用。
  2. &lt;tag onEvent='event_handler_script'&gt;&lt;a href='javascript:click_handler_script'&gt; 都被视为 inlnie 脚本,但不能被 'nonce-value' 或/和 'hash-value' 标记所允许。但是 Chrome 会为它们计算 sha256,因为它准备实现 'unsafe-hashes' 令牌(规范部分不是规范的所以实现延迟已经支持 is implemented)。

因此,在情况 (1) 中,您可以轻松摆脱“不安全内联”,在情况 (2) 中 - 您需要先修改代码。

脚本中的'unsafe-eval'

内容安全策略规范未提供允许通过“nonce/hash”令牌构造不安全脚本的方法。在某些情况下,需要更改脚本代码 - 纯粹是“装饰”。

CSP 认为是eval-constructs:

  • eval()
  • setTimeout('string')
  • setInterval('string')
  • 函数()
  • setImmediate()
  • execScript()

请注意,setTimeout()/setInterval() 仅当回调函数作为字符串传递时才是“eval”。如果回调是匿名函数或“按名称命名的函数” - 那些 不属于 eval 的。 在这种情况下,您可以轻松摆脱 eval 而无需更改脚本的逻辑。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
  • 2019-06-29
  • 1970-01-01
  • 2021-10-19
  • 2018-05-01
相关资源
最近更新 更多