‌CSRF Token

cookis和session的会话/授权策略有问题,token没有这个问题

HTTP状态码419:页面过期的技术提示

在网络技术领域,419状态码表示**"页面已过期"** ,常见于提交表单时因会话超时或CSRF令牌验证失败(例如使用Laravel框架的网站)。解决方法通常是刷新页面或重新登录,与常见的404(页面不存在)或500(服务器错误)不同,419更多指向用户端操作问题。

CSRF Token 是网站用来防止别人冒充你操作的安全令牌‌,服务器生成一个随机字符串放在表单或请求头里,提交时验证这个字符串对不对,不对就拒绝请求,主要保护修改密码、转账这类重要操作。‌‌

为什么Cookie 无法防止CSRF攻击,而token可以?【马士兵

https://www.bilibili.com/video/BV1KV4y1A7C4/?vd_source=78fa7c7dc435ffa9959b97793c0946f1

13 Django5中的CSRF Token的用法

【网络安全教程】2026年B站最全最详细的网络安全零基础入门全套教学!全程干货精讲,少走99%弯路,挑战7天从小白逆袭成大神!

https://www.bilibili.com/video/BV1KGQmB3E2s/?p=71&vd_source=78fa7c7dc435ffa9959b97793c0946f1

为啥需要这个令牌

  1. 防止冒充操作‌:当你登录银行网站后,如果不小心点了恶意链接,攻击者能借着你已登录的状态偷偷发起转账请求,服务器会以为是你在操作。CSRF Token 就像每次操作都要输入的动态验证码,攻击者拿不到这个令牌就无法伪造请求。
  2. 令牌绑定的秘密‌:这个令牌跟你的会话绑定,每个用户的令牌都不一样,而且是随机生成的不可预测。攻击者即使能诱导你访问恶意页面,也猜不出你当前会话的令牌值是什么。
  3. 只保护重要操作‌:CSRF Token 主要针对会改变状态的请求,比如 POST、PUT、DELETE 这些方法,普通的 GET 请求查看页面不需要传令牌。‌‌百科‌

实际开发中怎么用

  1. Django 框架 ‌:在设置文件里确保 django.middleware.csrf.CsrfViewMiddleware 中间件已启用,模板里用{% csrf_token %}标签自动嵌入令牌,提交时 Django 会自动验证。
  2. Flask 框架 ‌:通过 Flask-WTF 扩展实现防护,表单里用{``{ form.hidden_tag() }} 包含令牌字段。
  3. 前后端分离场景 ‌:如果是 Vue、React 等前端框架调用后端 API,令牌要放在自定义 HTTP 请求头里发送,比如 X-CSRF-Token,不能只靠表单字段。
  4. Symfony 框架 ‌:表单模板里调用 {``{ form_widget(form._token) }} 嵌入令牌,控制器用$this->isCsrfTokenValid() 校验,令牌绑定的是会话加表单名称。‌‌百科‌

常见坑和注意事项

  1. 令牌不能重复用‌:CSRF Token 最好每次请求都换新的,如果把令牌缓存起来长期复用,攻击者截获一次就能反复伪造请求。

  2. 别放 URL 里‌:令牌不要放在 URL 查询参数里传输,容易通过浏览器历史记录或 Referer 泄露,应该放在隐藏表单字段或请求头里。

  3. 会话要共享‌:分布式部署时,如果多台服务器不共享会话存储,令牌在 A 服务器生成、B 服务器校验会失败,需要用 Redis 等集中存储。

  4. Cookie 属性要配好‌:相关 Cookie 要设置 HttpOnly、Secure、SameSite 属性,防止令牌被脚本窃取或跨站发送。

  5. 校验失败别暴露细节‌:验证失败时只返回 403 错误,不要提示具体是令牌过期还是不匹配,否则攻击者能做差分测试。‌‌百科‌