由于安全策略,Electron.js 未加载 jQuery

Electron.js does not load jQuery due to security policy

我正在尝试在 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>

的答案对我也不起作用。我该怎么办?

就此而言,Electron 或任何其他实现 Content Security Policy 的 Web 浏览器 正确地拒绝 从任意 origin (URL),甚至是“内联”脚本(例如 script 元素内的脚本文本),是因为您的安全策略明确指定为 拒绝这样的尝试,你说你添加的meta元素:

<meta http-equiv="Content-Security-Policy" content="script-src 'self';">

你为什么添加它?是不是出自别人之手?为什么它在那里?这就是 Electron 拒绝加载有问题的脚本的原因。

上面 content 属性的值具有指示 Electron 允许从相同来源加载脚本的效果] 作为包含 meta 元素的文档的来源。这实际上 排除了 所有其他来源,例如 https://code.jquery.com 内联脚本(在这种情况下必须明确允许,因为 self否认这些)。基本上,该值将被解释为“只允许从同一站点加载脚本”。内联脚本被视为“同一站点”。

更简单地说,您自己禁止使用 meta 元素从您随后尝试使用的位置加载脚本。

您需要了解如何 Content Security Policy mechanism works 并适用于您的情况。您将必须决定是否要允许从 code.jquery.com 等域加载脚本,或者是否只允许从您的网站加载脚本,这反过来可能需要您复制 JQuery 您想使用您的网站提供服务的图书馆。您还必须决定是否允许在您的网站上使用“内联”脚本,无论出于您认为必要的任何原因。

安全策略机制本身非常有用,不要回避它,它的存在是有原因的 -- 帮助您防止站点用户被其他恶意脚本或机制加载的恶意脚本滥用。但显然你需要正确使用它。

你有 2 个问题因为 jQuery:

  1. 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;.

  2. 页面加载后,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 是:

script-src 'self' 'unsafe-eval' https://code.jquery.com;

或更好:

default-src 'self'; script-src 'self' 'unsafe-eval' https://code.jquery.com;

注意:与常见的误解相反,'self' 并不意味着 同源策略 ,CSP 对 'self' 的解释更为广泛。