将 crypto.js 值传递给脚本随机数

Pass crypto.js value to script nonce

我已经使用 node-helmet 设置了我的项目 CSP,所以它看起来像这样:

// app.js

let nonce = require('./config/nonce')

app.use(
  helmet.contentSecurityPolicy({
    directives: {
      defaultSrc: ["'self'"],
      scriptSrc: ["'self'", nonce],
      // other stuff
    },
  })
);

// config/nonce.js 

const crypto = require('crypto');
let nonce = crypto.randomBytes(16).toString('base64');

module.exports = nonce;
// faqController.js

require("dotenv").config();
let nonce = require('../config/nonce')

exports.faq = function (req, res) { 
  res.render("faq", {
    nonce: nonce
  });
};

我可以使用 <%= nonce %> 在 HTML 中将 nonce 显示为文本,因此我知道该值已正确传递,但是当我尝试将该值传递给脚本上的 nonce 属性时标签,价值似乎没有通过。我只是收到一条错误消息,说脚本违反了我的 CSP

编辑#2:

我现在在我的控制台中收到此错误:

The source list for Content Security Policy directive 'script-src' contains an invalid source: 'myValueFromCrypto'. It will be ignored

我看到很多人建议对随机数使用加密...为什么我的 CSP 忽略了它?

编辑#3:

我改了let nonce = crypto.randomBytes(16).toString('base64');let nonce = crypto.randomBytes(16).toString('hex'); 这使得 CSP 接受该值..但我仍然无法将 crypto 创建的值传递到我的脚本标签中的 nonce 属性中......这是怎么回事!

我感觉问题一定出在scriptSrc: ["'self'", nonce]...我真的不知道!

我通过将我的 csp 更改为以下解决了这个问题: scriptSrc: ["'self'", `'nonce-${nonce}'`],,希望有一天这对某人有所帮助!