问题描述
我最近将 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-src
的 unsafe-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-inline
的 script-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'
。