跳转到内容

CSRF 防护

csrf 中间件实现了 CSRF 防护,采用 Double-Submit Cookie 策略。安全方法(GET/HEAD/OPTIONS)自动设置 Token Cookie,非安全方法要求请求头中携带匹配的 Token,否则返回 403

import { csrf } from "@ventostack/core";
app.use(csrf());

客户端需在非安全请求中携带 Token:

// 从 Cookie 读取 _csrf 值,放入请求头
const token = document.cookie
.split("; ")
.find((c) => c.startsWith("_csrf="))
?.split("=")[1];
fetch("/api/data", {
method: "POST",
headers: { "x-csrf-token": token },
});
选项类型默认值说明
tokenHeaderstring"x-csrf-token"请求头名称
cookieNamestring"_csrf"Cookie 名称
safeMethodsstring[]["GET", "HEAD", "OPTIONS"]不校验 Token 的 HTTP 方法
tokenLengthnumber32Token 字节长度(生成十六进制字符串)

完整类型定义:

interface CSRFOptions {
tokenHeader?: string;
cookieName?: string;
safeMethods?: string[];
tokenLength?: number;
}
function csrf(options?: CSRFOptions): Middleware;
  • Token 比较使用 timingSafeEqual 恒定时间算法,防止时序攻击
  • Cookie 设置了 HttpOnlySameSite=Strict 属性
  • Token 在首次安全方法请求时自动生成并写入 Cookie
  • 验证失败返回 403,错误信息分别为”缺少 CSRF 令牌”或”CSRF 令牌不匹配”