在现代Web应用中,服务端需要对请求进行合法性校验,以防止恶意攻击(如跨站请求伪造CSRF)。

早期一种常见的做法是依据HTTP请求头中的Origin或Referer信息来判断请求来源,只放行来自可信站点的请求。然而,这种机制存在明显缺陷,因此逐渐被更安全的方案,如CSRF Token所取代。
服务端检查每个请求的Origin或Referer头:
这种方法的逻辑是:正常浏览器请求会自动带上当前页面的来源,因此可以借此区分“本站内发起的请求”和“外部站点发起的跨站请求”。
Origin和Referer完全由客户端(浏览器、脚本、命令行工具)控制。攻击者可以轻易构造带有任意Referer值的请求,从而绕过服务端的来源校验。例如,使用curl直接添加Referer: 即可骗过服务器。
这使得该机制只能防御最基础的、不修改请求头的攻击,防护强度较低。
为了SEO,网站必须放行搜索引擎爬虫(如Googlebot)的请求。但服务器通常只能通过User-Agent或Referer来识别这些爬虫,这就带来了两种风险:
User-Agent改为Googlebot,同时清空Referer,就可能绕过限制;google.com的Referer,攻击者可搭建恶意站点,伪造该Referer诱导用户点击,从而发起跨站请求。核心问题在于:所有关键校验字段都由客户端提供,服务端无法真正验证其真实性。
为了解决上述问题,现代Web应用普遍采用CSRF Token机制,它将校验依据从“请求来源”转移到“服务端与前端预先协商的、不可预测的密钥”。
当用户首次访问页面或登录成功后,服务端生成一个随机、不可预测的字符串(CSRF Token),并将该Token与当前用户的会话(Session)绑定。同时,Token被安全地写入前端页面,例如放在表单的隐藏字段中,或存储在<meta>标签内供JavaScript读取。
当用户执行需要保护的敏感操作(如修改密码、转账)时,前端自动从页面中提取Token,并将其放入请求的特定位置(通常是请求头X-CSRF-Token,或POST表单字段)。这一过程对正常用户无感。
服务端收到请求后,取出请求中的Token,并与会话中保存的Token进行比对:
Origin或Referer,缺少有效Token的请求依然会被拦截。虽然CSRF Token能够有效防御CSRF攻击,但在实际工程中,为了兼顾安全性与用户体验,通常会组合使用多种防护手段:
SameSite=Lax或Strict,可阻止大多数跨站请求自动携带Cookie,从浏览器层面减轻CSRF风险。Origin/Referer的来源校验虽然实现简单,但其安全性严重依赖客户端上报的信息,容易被伪造,且在允许搜索引擎时存在明显绕过风险。SameSite、双重Cookie等多种策略,可以构建更纵深、更健壮的防护体系。小米路由器插件安装失败解决方案(小米路由器插件安装失败怎么办)
小米路由器为什么无法成功安装插件(小米路由器安装插件失败怎么处理)
小米路由器为什么无法将电视屏幕投射到其他设备上(如何解决小米路由器无法进行电视投屏的问题)
小米路由器为什么无法连接电视网络(小米路由器和电视连接不上网络怎么办)
Spring Boot项目中varchar字段为什么不用NULL?告别空指针从建表开始
程序员如何自学?编程能够自学吗?