我目前正在为使用 Next.js 制作的生产应用程序制定内容安全策略 (CSP)。虽然我找到了使用该框架实施 CSP 的可靠文档,但我想确保正确解决一些问题。
问题#1:我读到,在 HTTP 标头中设置的安全策略更可取。但是,我找不到使用这种方法在生产中传递内联样式的“nonce”属性的方法。 https://nextjs.org/docs/advanced-features/security-headers
问题#2:我见过其他示例,其中开发人员将其 CSP 注入自定义文档(“./pages/_document.js”)。我对使用这种方法犹豫不决,因为我听说元标签 CSP 很容易被绕过。 https://github.com/vercel/next.js/tree/canary/examples/with-strict-csp
我的问题:
祝一切顺利, -萨姆
NextJS 有 2 种预渲染模式:静态站点生成(SSG)和服务器端渲染(SSR)。第一个无法更新 HTML 代码中的
nonce='value'
,但是使用 SSR 时,您可以使用 'nonce'
为内联样式和脚本传递 ./pages/_document.tsx
属性。
请参阅 CSP 标头示例 和 元标记 CSP 示例。
回复问题:
next.config.js
是可能的,例如 next-safe
包在该文件中添加了 nextSafe() 函数来设置很多标头:const nextSafe = require('next-safe')
const isDev = process.env.NODE_ENV !== 'production'
module.exports = {
async headers () {
return [
{
source: '/:path*',
headers: nextSafe({ isDev }),
},
]
},
}
要将“nonce”设置到 CSP 标头中,您可以通过这种方式编写自己的函数。要将“nonce”属性设置为样式,您可以使用
_document.tsx
渲染器。
在生产中为
styles指定
'unsafe-inline'
不是安全问题。例如 https://accounts.google.com 页面允许内联样式(它甚至没有 style-src
/default-src
指令,但它仔细控制脚本)。
在 HTTP 标头中设置 CSP 是更好的选择,但这并不意味着元标记中的 CSP 很容易被绕过。只是元标记中的 CSP 有一些限制,如果您不使用受限制的功能,您可以安全地使用元标记来传递 CSP。
您可以无限期地加强保护,花费大量的时间和资源。只要遵循主要原则“保护不应该比被保护的对象更昂贵”。