讲师中心 微信公众号
AI工具推荐 视频效率加速

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

雨辰君_2577

雨辰君_2577

发布时间:2026-05-25 07:40:19

|

625人浏览过

|

来源于php中文网

原创

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 的销毁动作严格同步。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

更多
cookie
cookie

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

11719

2023.06.30

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

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

1086

2023.11.23

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

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

804

2024.02.23

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

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

1886

2025.08.19

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

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

580

2023.10.17

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

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

876

2023.10.18

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

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

1886

2025.08.19

Revel框架入门与安装配置
Revel框架入门与安装配置

本专题从Revel框架环境搭建讲起,系统介绍命令行工具安装、项目创建、目录结构、配置文件及热代码重载,帮助开发者快速完成首个Go Web应用。

0

2026.10.16

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

0

2026.10.15

热门下载

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

精品课程

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

共10课时 | 13.8万人学习

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

共10课时 | 11.1万人学习

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

共116课时 | 32.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn