'self' 脚本被阻止加载,但当我使用 nonce 时它们可以工作?

'self' scripts being blocked from loading, but when I use the nonce they work?

可能有一个简单的解决方案,但我想不出来。

我有一个 CSP 定义如下:

"Content-Security-Policy: default-src * 'unsafe-inline' 'unsafe-eval' data: blob:; style-src 'unsafe-inline' 'self' cdnjs.cloudflare.com fonts.googleapis.com; script-src www.google-analytics.com cdnjs.cloudflare.com 'self' 'nonce-". $_SESSION['nonce'] . "'; img-src * 'self' data:;object-src 'self' sias.dev:8000; connect-src * 'unsafe-inline'; frame-src 'self' sias.dev:8000 www.google.com;"

CSP 需要稍微调整一下,但部分工作正常。我需要一个随机数,因为我有一些带有内联脚本的遗留站点。 nonce 是动态生成的,并在页面加载时更改。但是,我 运行 遇到一个问题,我正在通过 AJAX 调用的页面上加载一些 'self' 脚本(不是内联,而是脚本 src 标签。这可能是不好的做法,但我不想加载那些除了通过 ajax.

调用的页面

最重要的是运行我在那个页面上没有任何内联脚本,只有像下面这样的脚本 src 标签,其中随机数是动态的并且与 CSP 策略中的匹配。

<script nonce = "" src="/js/create_dicom/js/plupload.full.min.js"></script>
<script nonce = "" src="/js/create_dicom/js/jquery.ui.plupload.min.js"></script>
<script nonce = "" src="/js/create_dicom/js/main.js"></script>
<script nonce = "" src="/bower/pdfjs/src/pdf.js"></script>
<script nonce = "" src="/bower/pdfjs/src/pdf.worker.js"></script>

当我不使用随机数时,我得到:

"Content Security Policy: The page’s settings blocked the loading of a resource at inline (“script-src”)."

当我使用随机数时,它们可以正常加载并且页面可以正常工作。我认为您只需要内联脚本的随机数而不是 'self' 脚本。我应该以某种方式使用 strict-dynamic 吗?我不需要在 script-src 标签的主页中使用 nonce。他们在那里加载正常?

此外,我需要 nonce 的地方大多在通过 AJAX 加载的页面上。有没有办法重构事物(即将它们放入 .js 文件并以这种方式加载相关的 .js)。这有点痛苦,因为我没有脚本加载器,我只想为通过 AJAX.

加载的文件加载相关的 js

谢谢。

  1. 控制台错误:The page’s settings blocked the loading of a resource at INLINE 说你肯定有一个内联脚本被阻止而不是外部的,因此它与 'self' 无关。您可以查看右侧的控制台角并查看 script_name:line_number:column 它发生的位置。
    在锁定外部脚本的情况下,错误看起来像:The page’s settings blocked the loading of a resource at HTTPS://EXAMPLE.COM/PATH/SCRIPT.JS.

  2. 可以是3种inline scripts<script>...<script><a href='javascript:void(0)'<a onclick='evtHandler()'。 Firefox 不区分这些,Chrome 更冗长,所以看看它在 Chrome 浏览器中看起来如何这个错误。
    有 2 个选项:
    - Chrome 中没有错误 - 这很好,FF 因 false positive 违规而闻名
    - Chrome 中有错误 - 您有一个内联脚本,Chrome 会准确说明是哪个。

  3. 通过浏览器控制台日志调整 CSP 是不好的做法。你使用pdf.min.js,但是这个脚本包含一段代码:

const n = document.createElement("script");
n.src = e;
n.onload = t;
n.onerror = function() {
r(new Error("Cannot load script at: " + n.src))
};
(document.head || document.documentElement).appendChild(n)

这意味着在某些情况下可以加载一些外部脚本。只有上帝知道您需要按什么键才能发生这种情况,以及将从何处加载此脚本。
因此,正确的方法(如果网站有访问者)是使用 report-uri 指令并在大约 2 周内分析违规报告。

PS:只是好奇 - 你指定:connect-src * 'unsafe-inline'; 所以你在某处有内联脚本?顺便说一下,'unsafe-inline' 标记没有用在 connect-src 指令中,它会被忽略。