javascript Electron.js由于安全策略而无法加载jQuery

jpfvwuh4  于 2023-04-04  发布在  Java
关注(0)|答案(2)|浏览(163)

我试图在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的答案对我也不起作用,我该怎么办?

vlf7wbxs

vlf7wbxs1#

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拒绝这些)。基本上,该值将被解释为“仅允许从同一站点加载脚本”。内联脚本 * 不 * 被视为“同一站点”(部分原因是允许来自任何[允许]来源的脚本修改文档,包括添加具有任意内联内容的script元素)。
更简单地说,您自己禁止从您试图使用的位置加载脚本,使用meta元素。
您需要了解Content Security Policy mechanism works和如何在您的情况下应用。您将不得不决定是否要允许从www.example.com等域加载脚本code.jquery.com,或者是否,例如,您将只允许从您的网站加载脚本,这反过来可能需要你复制你想要使用的JQuery库,以供你的网站使用。您还必须决定是否要在您的网站上允许“内联”脚本,无论出于何种原因,您可能认为有必要。
安全策略机制本身是非常有用的,不要回避它,它的存在是有原因的--帮助您防止其他恶意脚本或机制加载的恶意脚本滥用您的站点用户。但显然,您需要正确使用它。

dojqjjoe

dojqjjoe2#

你有两个问题,因为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;
    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是:
script-src 'self' 'unsafe-eval' https://code.jquery.com;

或者更好:

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

注意:与常见的误解相反,'self'并不意味着 * 同源策略 *,CSP对'self'的解释要宽泛得多。

相关问题