当前位置:首页 > 热点

csrf漏洞防护方法

一个真实的漏洞教训:某知名电商平台曾因CSRF漏洞,让攻击者仅凭一个构造好的防护方法图片链接,就替用户完成了下单、漏洞改收货地址、防护方法甚至清空购物车的漏洞操作。用户只是防护方法浏览了恶意网页,什么都没点,漏洞钱就没了。防护方法

CSRF的漏洞核心问题在于:浏览器会自动携带Cookie,服务器无法区分这个请求是防护方法用户主动发出的,还是漏洞被恶意网站“借刀杀人”。防住它,防护方法思路就一条——让服务器有能力验证请求的漏洞“真实意图”。

最常用的防护方法方法是同步令牌(Synchronizer Token)。服务器在渲染表单时,漏洞生成一个随机且不可预测的token,塞进隐藏字段里。用户提交时,后端校验这个token是否与session中存储的一致。攻击者构造的跨站请求,拿不到这个token,自然就过不了校验。这招简单粗暴,但有个坑:如果站点存在XSS漏洞,token会被偷走,防线直接崩塌。所以,CSRF防护的前提是XSS得管好。

另一种思路是检查请求头中的Origin或Referer字段。Origin是浏览器主动带上的,跨站请求的Origin会是攻击者的域名,而合法请求的Origin则是本站。Referer同样能提供来源信息,但某些隐私插件或浏览器设置可能不发送Referer,导致误伤。更麻烦的是,Referer有时会被路径信息污染,比如URL里带参数时,Referer会包含完整路径,校验时别只比对域名前缀,要精确匹配来源。

还有一种轻量级方案——自定义请求头。比如要求所有敏感操作必须通过XHR/fetch发起,并附带一个自定义头(如X-Requested-With: XMLHttpRequest)。因为跨站表单提交无法设置自定义头(除非触发CORS预检,而预检会被服务器拒绝),所以能有效拦截。但要注意,如果站点本身用了JSONP或允许跨域资源共享,这个方案就失效了。

再聊聊双提交Cookie。这种方法不依赖服务端session,把token同时放在Cookie和请求参数里,服务器比对两者是否一致。好处是无状态,适合分布式系统;坏处是如果子域被攻破,攻击者可以覆盖Cookie,从而伪造token。我见过不少团队图省事用这招,结果子域忘记加固,出了事。

防护还得分级。登录、改密、支付这类高权限操作,必须用token+二次校验(比如输入密码或验证码)。普通浏览操作,可以不设防,但别把“查看订单”这种泄露隐私的接口也裸露着。另外,设置Cookie时加上SameSite属性是个好习惯——Lax模式能阻止跨站发送Cookie,但GET请求的顶级导航仍会带上,所以对POST接口,SameSite=Strict更安全。不过,SameSite对老浏览器(IE)无效,别指望它独挑大梁。

最后说个容易被忽略的点:CSRF攻击不限于浏览器表单。移动端App里,如果WebView的Cookie存储和原生请求混用,同样可能被恶意网页利用。我见过一个案例,App内嵌了WebView,用户登录后Cookie存在共享存储里,一个恶意H5页面直接调用了原生API,悄悄发起了转账请求。所以,App内所有跨域请求,都得走统一的防护逻辑,别以为原生环境就安全。

说到底,CSRF防护没有银弹。Token是基石,Origin检查做辅助,SameSite兜底,再配合对敏感操作的多重验证。别嫌麻烦——每多一道校验,就多一道让攻击者头疼的坎。你不需要把所有方法都用上,但至少要选一条主路走通,并确保它覆盖所有敏感接口。测试时,用Burp Suite或Postman模拟跨站请求,看看是否真的被拦住了。别等到上线后被白帽子找上门,那才叫尴尬。

分享到: