建立严格动态 CSP 源需要为每个请求维护一个唯一的 nonce 值。建议按照以下方式执行此操作:本文是:
设置_secure_random_alphanum $cspNonce 32;
虽然我使用的是官方的 nginx docker 镜像,但它没有安装 nginx_set_misc 模块,因此此行失败并出现错误:
nginx:[emerg] /etc/nginx/security-headers-master.conf:54 中未知的指令“set_secure_random_alphanum”
我有两个选择:
– 安装非官方的带 lua 支持的 nginx 镜像,
– 使用可用的 nginx 变量,例如$请求ID,作为 nonce 值。
据我所知,根据 nginx 文档它可以适合:
$request_id – 由 16 个随机字节生成的唯一请求标识符,十六进制(1.11.0)
请分享您的想法。
答案1
如果你使用该NGX_OPENSSL
标志编译 nginx,$request_id
则值对于 CSP nonce 来说就足够了,因为它是一个 128 位加密强随机数OpenSSL 返回RAND_bytes()
。否则,该值将是伪随机的,这意味着推断出服务器 PRNG 状态的攻击者可能能够在其 XSS 负载中伪造正确的 request_id / CSP nonce。实际上,我不会太担心这一点,因为攻击并不简单,需要向服务器发送大量流量,但值得记住这一点。
需要注意的一件事是确保 request_id 值不会用于应用程序中可能敏感的任何其他内容,因为您将在 HTML 页面的源代码中将其公开给用户。