繁体   English   中英

如何允许内联 JS 脚本使用 Nonce 进行 CSP

[英]How to allow Inline JS Scripts using Nonces for CSP

我正在尝试在我的网站上实施 CSP。 我经常更改我的内联脚本,所以对于 CSP 来说,哈希对我来说是个坏主意

我读到可以使用随机整数的 Nonce 来实现 CSP。

我正在使用 WordPress。 下面是我的 CSP 标头。

Header add Content-Security-Policy "default-src 'self'; script-src unsafe-hashes 'self' https://milyin.com https://cdnjs.cloudflare.com https://cdn.tiny.cloud  https:; object-src 'none';base-uri 'none';img-src https: data:;style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://www.google.com https:;report-uri https://milyin.com/?csp=true"

正如您可能知道的那样,内联脚本不会从中执行。 那么如何实现呢。

最初的研究让我发现了哈希的想法,而且我可以从 chrome 开发工具中获取脚本的哈希这一事实使它变得简单明了。

但是,对任何脚本进行最轻微的更改都会要求我更改哈希,这一事实令人头疼。

所以我听说了nonce。

请建议如何实现它,并(如果可能)告诉他们是否存在像我这样的 wordpress 用户更简单的方法。

所以我有几个疑问:

  1. 什么是随机数? 据我了解,这是我喜欢的随机整数。

  2. 我可以使用相同的 nonce 所有脚本吗? 我的意思是我可以说Header add Content-Security-Policy "default-src 'self'; script-src 'self' 'nonce-69'然后把<script nonce="69"放在我网站的每个脚本中?

  3. 我需要经常更改 Nonce 吗? 我的意思是如果 Nonce 是恒定的,那么有人可以简单地使用相同的 nonce 放置注入脚本并让它工作。 如何防止这种情况。

1.) 什么是随机数? 据我了解,这是我喜欢的随机整数。

Nonce 是 base64 编码值:

; Nonces: 'nonce-[nonce goes here]'
nonce-source  = "'nonce-" base64-value "'"
base64-value  = 1*( ALPHA / DIGIT / "+" / "/" / "-" / "_" )*2( "=" )

2.) 我可以使用相同的 nonce 所有脚本吗? 我的意思是我可以说 Header add Content-Security-Policy "default-src 'self'; script-src 'self' 'nonce-69' 然后把 <script nonce="69" 放在我网站的每个脚本中?

是的,您可以使用一次生成的随机数,而无需为页面上的每个脚本生成一个新的随机数。
要生成随机数,您可以使用:

3.) 我需要经常更改 Nonce 吗? 我的意思是如果 Nonce 是恒定的,那么有人可以简单地使用相同的 nonce 放置注入脚本并让它工作。 如何防止这种情况。

根据CSP 规范,服务器每次传输策略时都必须生成一个唯一的 nonce 值。 生成的值应至少为 128 位长(编码前),并且应通过密码安全的随机数生成器生成,以确保攻击者难以预测该值。
这意味着您必须在每个页面加载时重新生成一个随机数。

顺便说一句,你有一个错误... script-src unsafe-hashes 'self' ... - unsafe-hashes标记应该是一个单引号: 'unsafe-hashes' 但无论如何它没有用,因为 Safari 不支持它。

必须为每个页面加载生成一个唯一的 nonce推出基于 nonce 的 CSP 的架构通常用于自定义 Web 应用程序 - 对于 Wordpress 网站来说会非常复杂,因为我想您可能正在使用 Caching / CDN。

我建议保留 Wordpress 网站的'unsafe-inline' 如果您有其他更重要的页面(如结帐页面/管理页面),您可以创建一个单独的 CSP。

话虽如此,如果您继续使用 nonces 实现 CSP,您可能需要添加'strict-dynamic''unsafe-eval'权限。

我写了一个小类来生成标题和随机数以供以后使用。 CspBuilder类的每个构造都将创建一个唯一的随机数,供以后使用。 只要脚本在 .php 文件中被引用,这将起作用:

$Csp = (new \CspBuilder(true))
    -> addCspPolicyNonce(CspDirective::Script)
    -> setCspHeader();

setCspHeader() 的副作用是生成完整的Content-Security-Policy 在 PHP 文件中包含脚本的任何地方都使用:

<script nonce="<?=$Csp->getNonce?>">

在这个经过全面类型检查的小型类中还有更多选项。 阅读说明或代码。 链接在这里: https ://github.com/theking2/php-csp-builder

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM