Probé todas las soluciones posibles que se me ocurrieron para generar un nonce y pasarlo al CSP y a todos los scripts en línea con la variable nonce. He leído muchos artículos y todos son muy vagos sobre cómo hacer esto. He generado con éxito el nonce y está generando una cadena hexadecimal única en la carga de la página. Sin embargo, parece que no puedo descifrar cómo pasar ese nonce generado al CSP o las etiquetas de script de manera efectiva. Así es como se ve en el archivo route.js:
router.route('/') .all(checkAuthentication) .get( (req, res, next) => { cspNonce = crypto.randomBytes(16).toString('hex'); next(); console.log("Nonce is" + cspNonce); // PREVENT PAGE CACHING res.setHeader('Cache-Control', 'private, max-age=0, no-cache, no-store, must-revalidate'); res.setHeader('Expires', '-1'); res.setHeader('Pragma', 'no-cache'); res.setHeader('Vary', '*'); res.setHeader('Strict-Transport-Security', "max-age=31536000; includeSubDomains; preload"); res.setHeader('X-Content-Type-Options', "nosniff"); res.setHeader("Content-Security-Policy", "script-src 'nonce-${cspNonce}' http://localhost:* https://code.jquery.com/jquery-2.1.4.js https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js https://www.google-analytics.com/analytics.js https://www.googletagmanager.com https://vimeo.com https://player.vimeo.com/api/player.js https://use.fontawesome.com/0202fc905b.js https://cdn.fontawesome.com/js/stats.js https://use.fontawesome.com/webfontloader/1.6.24/webfontloader.js https://code.jquery.com/jquery-latest.min.js https://code.jquery.com/jquery-latest.min.js https://cdnjs.cloudflare.com/ajax/libs/gsap/1.19.0/TweenMax.min.js https://cdnjs.cloudflare.com/ajax/libs/gsap/1.19.0/TimelineMax.min.js https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.5/ScrollMagic.min.js https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.5/plugins/animation.gsap.js https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.5/plugins/jquery.ScrollMagic.js img-src: https://www.googletagmanager.com"); res.render('survey_views/survey_container', {host_mode: process.env.HOST_MODE}); })Además, cuando intento registrar en la consola la variable 'cspNonce' en otra parte de la aplicación, aparece sin definir. Estoy llamando a este nonce arriba en Router.js y necesito llamarlo en el archivo head.ejs que está unos niveles más arriba en la estructura.
Necesito descubrir cómo hacer que este nonce generado pase al CSP y poder llamarlo en otros archivos donde estoy tratando de ejecutar scripts en línea. Si alguien tiene alguna idea de lo que podría estar yendo mal aquí, sería muy útil.
Gracias por adelantado.
Lo escribo en res.locals (res.locals.cspNonce en mi caso) y tanto la función CSP como el procesador de scripts lo leen desde allí.
También sugeriría reemplazar hex con base64 ya que es más compacto.