其他
用同步令牌、双提交 Cookie 与 SameSite…
在保护 Web 表单、状态变更接口或做纵深防御认证时,为请求加上 CSRF 校验层。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 48/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 56/100 ×0.15
适用场景
用同步令牌、双提交 Cookie 与 S通用
解决思路
- 选择防护方式:Synchronizer Token(隐藏表单字段 + 服务端校验,所有浏览器支持)、Double Submit(Cookie 与请求头必须一致,所有浏览器支持)、SameSite Cookie(浏览器拦截跨源请求,现代浏览器支持),并可叠加使用形成多层防御。
- 生成令牌:用 crypto.randomBytes(32).toString('hex') 生成随机 token。
- 添加中间件:若 req.session.csrfToken 不存在则生成并存入 session,再通过 res.locals.csrfToken 暴露给模板层。
- 校验请求:在 app.post('*') 中读取 const token = req.body._csrf || req.headers['x-csrf-token'],与 req.session.csrfToken(缺省为 '')比对。
- 校验时先显式比较长度(crypto.timingSafeEqual 在缓冲区长度不等时会抛 RangeError),长度不一致直接返回 403;长度一致后再用 crypto.timingSafeEqual(Buffer.from(token), Buffer.from(csrf)) 做常量时间比较,不通过则返回 403。
- 配置 Cookie 属性:session 的 cookie 设置 httpOnly: true、secure: true、sameSite: 'strict'(或 'lax')、maxAge: 3600000。
- 在 HTML 表单中集成:加入 <input type="hidden" name="_csrf" value="<%= csrfToken %>">。
- 对所有状态变更请求(POST、PUT、DELETE)都应用校验。
- 敏感 Cookie 使用 SameSite=Strict。
- 校验 Origin/Referer 请求头。
- 永远不要用 GET 做数据修改。
- 为令牌设置过期时间(典型 1 小时)。
- 组合多种防御层一起使用。
- 需要其他技术栈实现时参考 references/python-react.md:Flask-WTF 的完整 CSRF 配置、React 管理 CSRF token 的 hooks、双提交 Cookie 模式。
适用边界 · 注意事项
- 不适用于只读的 GET 接口——不要为不加修改语义的请求引入 CSRF 校验;但同时不能因为接口需要登录就认为它免疫 CSRF。
- 不要跨会话复用同一个令牌,也不要把令牌存进 localStorage。
- 不要缺少令牌过期时间,这会削弱防护效果。