🔐 CSRF Token
CSRF令牌生成,随机CSRF Token生成,防护指南
⚙️ Token配置
🔑 生成的Token
📖 CSRF防护指南
什么是CSRF?
跨站请求伪造(Cross-Site Request Forgery)是一种攻击,诱导用户在已认证的Web应用上执行非预期操作。
防护方案:
跨站请求伪造(Cross-Site Request Forgery)是一种攻击,诱导用户在已认证的Web应用上执行非预期操作。
防护方案:
// 1. Synchronizer Token Pattern (同步令牌)
// 服务端生成Token,存入Session
app.use((req, res, next) => {
if (!req.session.csrfToken) {
req.session.csrfToken = crypto.randomBytes(32).toString('base64');
}
res.locals.csrfToken = req.session.csrfToken;
next();
});
// 表单中嵌入隐藏字段
// <input type="hidden" name="_csrf" value="{{csrfToken}}">
// 验证Token
app.post('/api/*', (req, res, next) => {
if (req.headers['x-csrf-token'] !== req.session.csrfToken) {
return res.status(403).json({ error: 'CSRF token mismatch' });
}
next();
});
// 2. Double Submit Cookie (双重提交Cookie)
// 设置Cookie: Set-Cookie: csrfToken=xxx; SameSite=Strict
// 请求时在Header中发送: X-CSRF-Token: xxx
// 服务端比较Cookie和Header中的Token
// 3. SameSite Cookie属性
Set-Cookie: session=abc; SameSite=Strict; Secure; HttpOnly
最佳实践:
• Token必须使用加密安全的随机数生成器(CSPRNG)
• Token长度至少128位(16字节)
• 每个会话使用不同的Token
• 敏感操作需要重新验证Token
• 结合SameSite Cookie属性
• 验证Referer/Origin头作为辅助
• Token必须使用加密安全的随机数生成器(CSPRNG)
• Token长度至少128位(16字节)
• 每个会话使用不同的Token
• 敏感操作需要重新验证Token
• 结合SameSite Cookie属性
• 验证Referer/Origin头作为辅助