我试图在Electron(v. 16.0.0)中加载jQuery,但我得到这个错误:
在head
元素中,我包含了这一行:
<meta http-equiv="Content-Security-Policy" content="script-src 'self';">
另外,在body
元素中,我尝试像这样加载jQuery:
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
我尝试了很多方法来寻找解决方案,但都无济于事。之前,我也尝试过像这样加载jQuery,但它给了我一个类似的错误,如下所示:
<script>window.$ = window.jQuery = require('./libraries/jQuery/jquery.min.js');</script>
a related question的答案对我也不起作用,我该怎么办?
2条答案
按热度按时间vlf7wbxs1#
Electron或任何其他实现Content Security Policy的Web浏览器之所以会“正确地拒绝”从任意 origin(URL)加载脚本,甚至是“内联”脚本(例如
script
元素内的脚本文本),是因为您的安全策略被明确指定为“拒绝”此类尝试,您说您添加了meta
元素:你为什么要添加它?它是由其他人的手吗?为什么它在那里?这就是为什么Electron否认加载有问题的脚本的原因。
上面的
content
属性的值具有指示Electron * 仅 * 允许从与包含meta
元素的文档的来源 * 相同的来源 * 加载脚本的效果。这实际上 * 排除 * 所有其他来源,如https://code.jquery.com
* 和 * 内联脚本(在这种情况下必须明确允许,因为self
拒绝这些)。基本上,该值将被解释为“仅允许从同一站点加载脚本”。内联脚本 * 不 * 被视为“同一站点”(部分原因是允许来自任何[允许]来源的脚本修改文档,包括添加具有任意内联内容的script
元素)。更简单地说,您自己禁止从您试图使用的位置加载脚本,使用
meta
元素。您需要了解Content Security Policy mechanism works和如何在您的情况下应用。您将不得不决定是否要允许从www.example.com等域加载脚本code.jquery.com,或者是否,例如,您将只允许从您的网站加载脚本,这反过来可能需要你复制你想要使用的JQuery库,以供你的网站使用。您还必须决定是否要在您的网站上允许“内联”脚本,无论出于何种原因,您可能认为有必要。
安全策略机制本身是非常有用的,不要回避它,它的存在是有原因的--帮助您防止其他恶意脚本或机制加载的恶意脚本滥用您的站点用户。但显然,您需要正确使用它。
dojqjjoe2#
你有两个问题,因为jQuery:
script-src 'self'
不允许从https://code.jquery.com/jquery-3.6.0.min.js
加载脚本,这就是为什么你观察到 * 拒绝加载脚本'https://code.jquery.com/jquery-3.6.0.min.js'... * 错误。您必须将CSP至少调整为
script-src 'self' https://code.jquery.com;
。1.页面加载后,jQuery会提取所有包含
$()
的脚本,并将它们放入<head>
部分的一个内联脚本中。这就是为什么您会观察到 *Refused to execute inline script... * 错误。这个内联脚本可以用
'unsafe-inline'
或'unsafe-eval'
或'nonce-value'
(对于jQuery〉3.4)解析。允许
'unsafe-inline'
是一个非常有害的建议,因为这样的CSP根本不会保护XSS(https://youtu.be/zlH_bBQMgkc?t=717)。此外,Electron不具备刷新“nonce”值的技术能力。
因此,您可以做的最安全的CSP是:
或者更好:
注意:与常见的误解相反,
'self'
并不意味着 * 同源策略 *,CSP对'self'
的解释要宽泛得多。