CSRF防护机制详解与企业级实施指南概述CSRF通过诱导受害者浏览器在已登录状态下向目标站点发起恶意请求。合理组合 `SameSite`、令牌与来源校验,可在不同业务场景下实现防护与可用性的平衡。防护策略矩阵基线:`SameSite=Lax`,对跨站必须场景评估 `None+Secure`高敏操作:强制CSRF Token并绑定会话与请求上下文来源校验:优先 `Origin`,退化使用 `Referer`幂等接口:避免跨站触发副作用,限制非简单请求令牌实现type CsrfContext = { sessionId: string; ua: string; ip: string }
function csrfTokenSign(ctx: CsrfContext, secret: string, ttlMs: number): string {
const payload = `${ctx.sessionId}.${ctx.ua}.${ctx.ip}.${Date.now() + ttlMs}`
const h = crypto.subtle.digestSync('SHA-256', new TextEncoder().encode(payload + secret))
const s = Array.from(new Uint8Array(h)).map(b => b.toString(16).padStart(2, '0')).join('')
return Buffer.from(`${payload}.${s}`).toString('base64url')
}
function csrfTokenVerify(token: string, ctx: CsrfContext, secret: string): boolean {
const raw = Buffer.from(token, 'base64url').toString('utf8')
const parts = raw.split('.')
if (parts.length !== 5) return false
const [sid, ua, ip, exp] = parts
if (sid !== ctx.sessionId || ua !== ctx.ua || ip !== ctx.ip) return false
if (Number(exp) < Date.now()) return false
const expect = csrfTokenSign({ sessionId: sid, ua, ip }, secret, Number(exp) - Date.now())
return expect === token
}
双重提交Cookie将CSRF Token同时放入Cookie与请求头/体服务器校验两者一致且与会话绑定对跨站场景配合 `SameSite=None; Secure`来源校验function checkOrigin(req: any, allowed: string[]): boolean {
const origin = req.headers['origin'] || ''
if (!origin) return false
return allowed.includes(origin)
}
function checkReferer(req: any, host: string): boolean {
const ref = req.headers['referer'] || ''
return ref.startsWith(host)
}
运维与测试建立高敏接口清单并强制CSRF校验针对跨域业务编写白名单与例外流程在端到端测试中模拟跨站提交与Token失效通过令牌、SameSite与来源校验的组合,可在复杂业务环境下实现稳健的CSRF防护。

发表评论 取消回复