Prevent CSRF (Cross-Site Request Forgery) attacks
CSRF tricks 已认证 users 为 submitting unwanted requests. Learn anti-CSRF tokens, SameSite cookies, 和 double-submit patterns.
- 1
CSRF exploits browser's 自动 sending 的 cookies. 如果用户是 logged 在 (cookies 存在) 和 visits malicious site, 该 site 能够 submit form 到目标 site — cookies 是 sent automatically. Prevention: (1) Anti-CSRF tokens (synchronizer 模式) — random 令牌在 form 和会话, verified 开 submission. (2) SameSite cookies — cookies 是不 sent cross-site. (3) Origin/Referer 头 validation. (4) Require 自定义 headers 为声明-changing requests.
- 2 HMAC 生成器 →
生成 an anti-CSRF token. The token should be: unpredictable (CSPRNG), per-session (or per-request for higher security), and bound to the user's session. HMAC(session_id, random) is a common pattern — it is deterministic (same session → same token) but unforgeable without the secret.
- 3 哈希计算器 →
为 double-submit 模式: 生成 random 令牌, 集合它 as Cookie (不 HttpOnly, 所以 JavaScript 能够读取它) 和包含它 as 头在 每个请求. 服务器 verifies 该 Cookie 和头 匹配. 此不 require 服务器-边声明. Use SHA-256 为令牌 hash.
常见问题
- 是 SameSite cookies enough 到 prevent CSRF?
- SameSite=Lax (默认在 现代 browsers) prevents CSRF 为顶部-级别 navigations (form POST, link clicks) 但 allows GET requests. SameSite=Strict prevents 所有 cross-site sending 但 breaks legitimate cross-site usage (e.g., following link 到你的 site 从 email). Use SameSite=Lax + CSRF tokens 为防御在 深度.
- CSRF vs XSS — 什么是 差集?
- XSS executes malicious 代码在 victim's browser ( attacker reads 数据或 performs 动作 as 用户). CSRF tricks victim's browser 为 making 请求到 site where 它们是 已认证 ( attacker 不读取响应). XSS 是代码 injection; CSRF 是请求 forgery. XSS 能够 bypass CSRF protections ( 脚本能够读取令牌).