Server Actions 是 Next.js 中最强大的特性之一,允许在组件中直接调用服务端函数。但能力越大,安全责任越大。本文将系统梳理 Server Actions 的安全风险和防护策略。
Server Actions 的安全模型
Server Actions 本质上是在服务器上执行的 RPC(远程过程调用)。Next.js 自动为每个 Server Action 生成一个唯一的端点 ID,客户端通过 POST 请求调用。这种设计带来了一些独特的安全考量:
1. CSRF 保护:Next.js 自动为 Server Actions 添加 CSRF 令牌验证,但仅在 production 模式下启用。开发时需额外注意。
2. 闭包安全:Server Action 闭包中引用的变量会被序列化发送到客户端。敏感信息绝不应直接出现在 Server Action 的闭包中。
常见安全漏洞与防护
1. 未授权访问:Server Actions 没有内置的认证机制。每个 action 函数内部都必须进行身份验证。
async function deletePost(formData: FormData) { const session = await getSession(); if (!session?.user) throw new Error("Unauthorized"); // 继续业务逻辑 }2. 参数注入:表单数据虽然经过序列化,但仍需在服务端进行严格验证。使用 Zod 或 Valibot 进行模式验证是必须的。
3. 速率限制:Server Actions 容易成为 DDoS 攻击目标。建议结合 Upstash Redis 或 Vercel KV 实现基于 IP 或用户的速率限制。
最佳实践清单
✅ 每个 Server Action 开头进行 session 校验
✅ 使用 Zod schema 验证所有输入
✅ 使用 useActionState 管理操作状态,避免并发提交
✅ 在生产环境启用 CSRF 保护
✅ 敏感操作使用 revalidatePath 清理缓存
✅ 记录关键操作的审计日志
评论 (0)