'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
谢谢。
控制台错误: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
.
可以是3种inline scripts:<script>...<script>
、<a href='javascript:void(0)'
和<a onclick='evtHandler()'
。 Firefox 不区分这些,Chrome 更冗长,所以看看它在 Chrome 浏览器中看起来如何这个错误。
有 2 个选项:
-
Chrome 中没有错误 - 这很好,FF 因 false positive 违规而闻名
-
Chrome 中有错误 - 您有一个内联脚本,Chrome 会准确说明是哪个。
通过浏览器控制台日志调整 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
指令中,它会被忽略。
可能有一个简单的解决方案,但我想不出来。
我有一个 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谢谢。
控制台错误:
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
.可以是3种inline scripts:
<script>...<script>
、<a href='javascript:void(0)'
和<a onclick='evtHandler()'
。 Firefox 不区分这些,Chrome 更冗长,所以看看它在 Chrome 浏览器中看起来如何这个错误。
有 2 个选项:
-
Chrome 中没有错误 - 这很好,FF 因 false positive 违规而闻名
-
Chrome 中有错误 - 您有一个内联脚本,Chrome 会准确说明是哪个。通过浏览器控制台日志调整 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
指令中,它会被忽略。