如何为 Next.js 应用设置内容安全策略 (CSP)
内容安全策略 (CSP) 对于防范跨站脚本 (XSS)、点击劫持和其他代码注入攻击等安全威胁至关重要。
通过使用 CSP,开发者可以指定哪些来源允许加载内容、脚本、样式表、图片、字体、对象、媒体(音频、视频)、iframe 等。
示例
Nonce 随机数
Nonce 是一个一次性使用的唯一随机字符串。它与 CSP 结合使用,可以绕过严格的 CSP 指令,选择性地允许某些内联脚本或样式执行。
为什么使用 Nonce?
尽管 CSP 旨在阻止恶意脚本,但在某些合法场景中内联脚本是必要的。此时,Nonce 提供了一种方式:只有携带正确 Nonce 的脚本才能执行。
通过中间件添加 Nonce
中间件 允许您在页面渲染前添加头部并生成 Nonce。
每次页面被访问时都应生成一个新的 Nonce。这意味着 必须使用动态渲染来添加 Nonce。
例如:
默认情况下,中间件会处理所有请求。您可以通过 matcher
筛选中间件仅在特定路径上运行。
建议忽略来自 next/link
的预取请求和不需要 CSP 头部的静态资源。
读取 Nonce
您可以通过 headers
在 服务器组件 中读取 Nonce:
不使用 Nonce 的情况
对于不需要 Nonce 的应用,可以直接在 next.config.js
文件中设置 CSP 头部:
版本历史
建议使用 v13.4.20+
版本的 Next.js 以正确处理和应用 Nonce。