jQuery 3.5.1 和 CSP 脚本-src-elem

Posted

技术标签:

【中文标题】jQuery 3.5.1 和 CSP 脚本-src-elem【英文标题】:jQuery 3.5.1 and CSP script-src-elem 【发布时间】:2021-07-28 01:23:00 【问题描述】:

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

拒绝执行内联脚本,因为它违反了以下内容 内容安全策略指令:“script-src 'self' 'nonce-7xyNokwFS08H1wnqtUmzycmiRKTgUZJQZJUN34B0v8A=''unsafe-eval'”。 '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,如浏览器的控制台日志所示。

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

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

default-src 'none'; script-src 'self' 'nonce-xxxxxxxx' 'unsafe-eval';script-src-elem 'self' 'unsafe-inline'; .......

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

【问题讨论】:

【参考方案1】:

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

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

您不需要'unsafe-eval',除非您自己不使用 eval 表达式。 您必须使用'nonce-value' 才能允许内联脚本。您gave a link 说 jQuery 3.x 与 'nonce-value' 存在问题,并且自 JQuery 3.1.1 以来它 was fixed。

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

script-src-elem 仅受 Chrome 支持。其他浏览器仅支持“script-src”。 所以 Chrome 浏览器会使用该策略:

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

Firefox/Edge/Safari 将使用该策略:script-src 'self' 'nonce-xxxxxxxx' 'unsafe-eval'

【讨论】:

谢谢。我想我可以决定是否需要添加unsafe-inline 这是我原来的问题***.com/questions/67377168/…

以上是关于jQuery 3.5.1 和 CSP 脚本-src-elem的主要内容,如果未能解决你的问题,请参考以下文章

如何使用CSP(内容安全策略)在WebForms项目中将动态创建的脚本列入白名单?

源代码'undefined'的脚本在CSP中是什么意思?

什么 CSP 子 iframe 从其父 iframe 继承?

JQuery 3.5.1 并拒绝执行内联脚本,因为它违反了以下内容安全策略指令:

内容安全策略拒绝列出白名单

使用 jQuery 更新脚本标签的 src - 使用 jQuery 重新加载脚本而不刷新页面