CSRF Token 是防止跨站请求伪造攻击最常用和最有效的防护机制之一。
CSRF Token 的基本原理
CSRF Token 是一个随机生成的、不可预测的字符串,服务器在用户访问受保护的页面时生成,并将其嵌入到表单中或通过其他方式传递给客户端。当用户提交表单时,服务器会验证请求中包含的 Token 是否与服务器存储的 Token 匹配。
Token 的生成和存储
-
生成阶段:
- 使用加密安全的随机数生成器
- Token 应该足够长(至少 128 位)
- 包含时间戳或会话 ID 等信息
- 可以使用 UUID 或其他唯一标识符
-
存储方式:
- 服务器端 Session:最常用的方式,将 Token 存储在用户 Session 中
- 加密 Cookie:将加密后的 Token 存储在 Cookie 中
- 数据库:将 Token 与用户关联存储在数据库中
Token 的验证流程
- 用户访问表单页面时,服务器生成 Token
- Token 被嵌入到表单的隐藏字段中
- 用户提交表单时,Token 随请求发送到服务器
- 服务器验证请求中的 Token 是否与 Session 中的 Token 匹配
- 验证成功则处理请求,失败则拒绝请求
实现示例
javascript// 生成 Token function generateCSRFToken() { return crypto.randomBytes(32).toString('hex'); } // 中间件验证 Token function csrfProtection(req, res, next) { const token = req.body._csrf || req.headers['x-csrf-token']; if (token !== req.session.csrfToken) { return res.status(403).send('Invalid CSRF token'); } next(); }
Token 的安全注意事项
- 一次性使用:每次请求后应该更新 Token
- 时效性:Token 应该有过期时间
- 唯一性:每个用户会话应该有独立的 Token
- 不可预测性:使用加密安全的随机数生成器
- HTTPS 传输:确保 Token 在传输过程中不被窃取
与其他防护措施的配合
CSRF Token 通常与其他防护措施配合使用:
- SameSite Cookie 属性
- Referer 头验证
- 自定义 HTTP 头
这种多层防护策略可以提供更全面的安全保护。