---
title: CSRF防护机制详解与企业级实施指南
keywords:
- CSRF
- 跨站请求伪造
- SameSite
- CSRF Token
- 双重提交Cookie
- Origin校验
- Referer校验
description: 全面阐述CSRF威胁模型与企业级防护方案,结合SameSite策略、令牌机制与来源校验,提供兼顾安全性与可用性的落地指南。
categories:
- 文章资讯
- 技术教程
---
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防护。

发表评论 取消回复