javascript - 如何允许内联 JS 脚本使用 Nonce 进行 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 用户更简单的方法。
所以我有几个疑问:
什么是随机数?据我了解,这是我喜欢的随机整数。
我可以使用相同的 nonce 所有脚本吗?我的意思是我可以说
Header add Content-Security-Policy "default-src 'self'; script-src 'self' 'nonce-69'
然后放入<script nonce="69"
我网站的每个脚本吗?我需要经常更改 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" 放在我网站的每个脚本中?
是的,您可以使用一次生成的随机数,而无需为页面上的每个脚本生成一个新的随机数。
要生成随机数,您可以使用:
- 在
mod_cspnonce
Apache Web 服务器的情况下 - NGINX 1.11.0+ web-server的$request_id变量
3.) 我需要经常更改 Nonce 吗?我的意思是如果 Nonce 是恒定的,那么有人可以简单地使用相同的 nonce 放置注入脚本并让它工作。如何防止这种情况。
根据CSP 规范 ,服务器每次传输策略时都必须生成一个唯一的 nonce 值。生成的值应至少为 128 位长(编码前),并且应通过密码安全的随机数生成器生成,以确保攻击者难以预测该值。
这意味着您必须在每个页面加载时重新生成一个随机数。
顺便说一句,您有一个错误... script-src unsafe-hashes 'self' ...
-unsafe-hashes
令牌应该是单引号:'unsafe-hashes'
。但无论如何它没有用,因为 Safari 不支持它。
推荐阅读
- reactjs - 如何使用本地 tinymce js 在 React 中加载 tinymce 编辑器
- r - if-else 条件产生奇怪的结果
- javascript - 调用仅以函数名作为字符串开头的函数(ES6 语法)
- ruby-on-rails - 如何将链接保存在数据库中并显示它们
- python-3.x - 从 Windows 切换到 Linux 时 Python 脚本出现错误
- python - pyOpenGL 远面渲染近面
- karate - 空手道 DSL 万无一失 - 报告重复时间
- java - Java中的逻辑运算顺序令人困惑
- java - Spring Boot Controller 应该如何处理“丢失”的请求标头?
- django - Django:没有返回 HttpResponse 对象错误