怎么防范跨站请求伪造CSRF_Session与Cookie安全设置

雨辰君_2577

雨辰君_2577

2026-05-25

625人浏览

原创

CSRF Token 必须与 Session 绑定,服务端生成后存入 Session 并显式传回前端;不能仅依赖 Cookie 或 SameSite,需配合 token 刷新、来源校验及生命周期同步。

CSRF Token 必须和 Session 绑定,不能只靠 Cookie

很多开发者以为只要设置了 httponly 和 secure 的 cookie 就安全了,其实完全不是。csrf 攻击不依赖读取 cookie,而是利用浏览器自动携带 cookie 的特性发起伪造请求。所以关键不是“藏好 cookie”,而是“验证这次请求真是用户本意”。csrf_token 必须在服务端生成后存入 session(比如 redis 或内存 session),并在表单或 api 请求头中显式传回;不能只靠 cookie 自动带、也不该把 token 直接写进 cookie 里返回给前端。

  • 常见错误:前端从 document.cookie 读取一个叫 csrftoken 的 Cookie 发起请求 —— 这个值如果没和服务端 Session 关联,攻击者可提前诱导用户访问恶意页面,触发一次合法请求拿到 token,再复用
  • 正确做法:每次新建 Session 时生成唯一 csrf_token,存入 Session 存储,并在渲染 HTML 时注入到 <meta name="csrf-token" content="..."> 或表单 hidden 字段;AJAX 请求统一从那里取值,通过 X-CSRF-Token 头发送
  • 注意:Token 不能重用,建议每次 POST/PUT/DELETE 后服务端主动刷新(或至少校验后失效),否则存在重放风险

Django/Flask/Express 中 CSRF 配置的典型陷阱

框架自带的 CSRF 保护看似开箱即用,但默认行为常被误解。比如 Django 的 csrf_protect 装饰器对 class-based view 生效逻辑不同;Flask-WTF 默认只保护表单提交,不自动拦截 JSON 接口;Express 的 csurf 中间件已废弃,新项目得用 csurf 替代品如 csrf 包,且必须手动注入 token 到模板。

  • Django:若用 JsonResponse 返回数据但前端用 fetch 提交 JSON,@csrf_protect 不生效 —— 必须确保请求头含 X-CSRFToken,且该值来自 get_token(request) 生成并传给前端
  • Flask:启用 WTF_CSRF_ENABLED = True 后,所有 POST 路由都会检查 form 中的 csrf_token 字段,但如果你用 request.get_json(),它不会自动解析 header,需手动调用 validate_csrf()
  • Express:csrf({ cookie: true }) 会让中间件往响应写一个 _csrf Cookie,但这个值**不是**用于校验的 token —— 真正要校验的是 req.csrfToken() 返回的那个,必须由路由显式返回给前端

SameSite Cookie 属性不是万能解药,尤其对老浏览器

SameSite=Lax 能挡住大部分跨站 POST,但它对 GET 请求放行(比如点击链接跳转),而有些业务逻辑确实绑在 GET 上(如注销接口 /logout?next=/)。更麻烦的是,IE11、旧版 Safari 和部分安卓 WebView 完全不支持 SameSite,设了也白设。

Ai Session Analysis
Ai Session Analysis

用于分析本地AI编程助手会话数据(如Claude Code、Codex、Kimi Code)。当用户请求分析编程会话时触发。

下载
  • 不要单独依赖 SameSite 防御 CSRF —— 它是辅助手段,不是替代方案
  • SameSite=Strict 会破坏正常跨站导航体验(比如从搜索引擎点进来打不开页面),实际很少用
  • 如果必须兼容 IE11,得回退到传统双 cookie + token 校验:服务端发两个 Cookie,一个 session_id(HttpOnly),一个 csrf_cookie(非 HttpOnly),前端读后者拼进请求头,服务端比对两者是否匹配

前后端分离场景下 CSRF Token 怎么安全透出

纯静态前端(Vue/React)部署在 Nginx,后端是独立 API 服务,跨域情况下 Cookie 默认不带,SameSite 更无效。这时候不能靠 Cookie 传 token,必须走显式通道,但又不能暴露在 URL 或 localStorage 里(XSS 可读)。

  • 推荐方式:首次加载 HTML 时,后端模板直接注入 token 到全局 JS 变量(如 window.CSRF_TOKEN = "abc123"),前端 axios/fetch 拦截器统一加 X-CSRF-Token 头
  • 避免方式:不要把 token 存 localStorage 或 sessionStorage —— XSS 一打就全漏;也不要放在 URL 参数里 —— 日志、代理、Referer 都可能泄露
  • 注意:如果首页是纯静态 HTML(无服务端模板),就得额外开一个免 CSRF 的 /api/csrf-token 接口,用 GET 返回 token,但该接口必须限制来源(Origin 校验)且禁止缓存

真正容易被忽略的是 token 生命周期管理 —— 很多人生成一次就长期有效,或者和 session 过期时间不一致。Session 过期了,token 却还能用;或者用户登出时没清 token,别人捡到就能继续用。这事关权限边界,得和服务端 session 的销毁动作严格同步。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

cookie session

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

2023.06.30

11719

10

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.23

1086

5

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

804

5

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

2025.08.19

1886

14

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

2023.10.17

580

4

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

2023.10.18

876

5

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

2025.08.19

1886

14

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

2026.10.16

0

15

Revel框架MVC路由与控制器
Revel框架MVC路由与控制器

本专题聚焦Revel框架MVC核心机制,讲解路由定义、控制器Action、参数绑定、请求响应和反向路由,并结合常见场景梳理接口请求处理流程。

2026.10.16

0

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
php注册登录系统开发实战
php注册登录系统开发实战

共10课时 | 13.8万人学习

PHP基于Cookie的购物车模块设计
PHP基于Cookie的购物车模块设计

共10课时 | 11.1万人学习

第三期培训_PHP开发
第三期培训_PHP开发

共116课时 | 32.6万人学习