微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

jQuery 3.5.1 和 CSP script-src-elem

如何解决jQuery 3.5.1 和 CSP script-src-elem

我最近将 jQuery 从 2.1.1 升级到 3.5.1,我开始在 Chrome 浏览器的控制台中看到这个 CSP 违规

拒绝执行内联脚本,因为它违反了以下内容 内容安全策略指令:“script-src 'self' 'nonce-7xyNokwFS08H1wnqtUmzycmiRKTgUZJQZJUN34B0v8A=''不安全评估'”。 'unsafe-inline' 关键字,一个散列 ('sha256-+oZkjQp5ZgVWtUq2rV5UqKJhNxGno8jem/DRZmR+mcI='),或随机数 ('nonce-...') 是启用内联执行所必需的。

b @ jquery.min.js:2

但是发布的 CSP 报告显示

"csp-report": {
    "document-uri": "https://subdomain.mydomain.com/docs/s","referrer": "https://subdomain.mydomain.com/","violated-directive": "script-src-elem","effective-directive": "script-src-elem","original-policy": "default-src 'none'; script-src 'self' 'nonce-7xyNokwFS08H1wnqtUmzycmiRKTgUZJQZJUN34B0v8A=' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; object-src 'self'; frame-src 'self'; connect-src 'self'; child-src 'self'; report-uri /csp/report;","disposition": "enforce","blocked-uri": "inline","line-number": 2,"column-number": 839,"source-file": "https://subdomain.mydomain.com/lib/jquery/3.5.1/jquery.min.js","status-code": 0,"script-sample": ""
  }

因此,违反的指令是 script-src-elem 而不是 script-src,如浏览器的控制台日志所示。

我知道在 CSP 3 中添加script-src-elem,如果此指令不存在,用户代理将查找 script-src 指令,如果两者都不存在,则回退到 {{1 }} 指令。

如果我添加 default-src 并保持 script-src-elem 'self' 'unsafe-inline' 与 nonce 相同,那么我看不到任何违规行为。

script-src

我正在使用支持 CSP 3 的 Chrome 版本 90.0.4430.93,我的问题是当用户代理不支持 CSP 3 时会发生什么?在这种情况下,它会回退到 default-src 'none'; script-src 'self' 'nonce-xxxxxxxx' 'unsafe-eval';script-src-elem 'self' 'unsafe-inline'; ....... 然后抛出错误,因为我没有 script-srcunsafe-inline

解决方法

我最近将 jQuery 从 2.1.1 升级到 3.5.1,我开始在 Chrome 浏览器的控制台中看到这个 CSP 违规

jQuery 2.x uses 'unsafe-eval' 在省略 use strict 时执行所有脚本。这种技术无意中绕过了'nonce-value'
jQuery 3.x 没有这样做,因此:

  • 除非您自己不使用 eval 表达式,否则您不需要 'unsafe-eval'
  • 您必须使用 'nonce-value' 来允许内联脚本。您gave a link 认为 jQuery 3.x 有 'nonce-value' 的问题,并且它 was fixed 自 JQuery 3.1.1 起。

我的问题是当用户代理不支持 CSP 3 时会发生什么?在这种情况下,它会回退到 script-src,然后抛出错误,因为我没有 unsafe-inlinescript-src

仅 Chrome 支持 script-src-elem。其他浏览器仅支持“script-src”。
因此 Chrome 浏览器将使用该策略:

  • script-src-elem 'self' 'unsafe-inline' 用于 <script><script src=> 标签
  • script-src 'self' 'nonce-xxxxxxxx' 'unsafe-eval' 用于内联事件处理程序和 javascript 导航(因为省略了 script-src-attr)。

Firefox/Edge/Safari 将使用以下政策:script-src 'self' 'nonce-xxxxxxxx' 'unsafe-eval'

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。