知识卡片
CSRF Token防御:攻击者无法预测的凭证,才是真正的防线
内容
既然CSRF利用的是”浏览器会自动附加cookie、但无法证明请求是用户主动发起”这个漏洞,防御的核心思路就是引入一份黑客无法提前获知或猜测的额外凭证:服务器为每个用户会话生成一个随机的Token,一份放到cookie里,同时要求所有会修改状态的请求(提交表单、发起业务操作)都必须在请求内容里(而不是自动附加的cookie里)显式携带这个Token,服务器端在处理请求时会校验”请求里带的Token”和”cookie里的Token”是否一致,只有两者匹配才认为这是一次合法的、由用户本人在页面上主动发起的请求。这里的关键在于,黑客即使能诱导浏览器发出携带cookie的请求,也无法读取到用户页面里嵌入的这个Token值(因为Token并不会像cookie那样被浏览器自动附加到跨站请求上),所以伪造的请求校验时Token要么缺失、要么不匹配,会被服务器直接拒绝。这个案例给出一条通用的身份校验设计原则:当某个凭证会被自动、无差别地附加到所有请求上时,这个凭证本身不足以证明请求的”主动性”,真正能证明请求确实来自页面本身的,是那些只有页面主动携带、攻击者无法从旁路获取的额外信息。
参考来源
- 位置:《高可用架构(第1卷)》第7章《安全与网络》"7.5 互联网主要安全威胁分析及应对方案"节,"7.5.2 威胁应对方案","4.CSRF Token检查"(源文件:_epub-src/OEBPS/Text/Chapter7_5_3.xhtml)
- 结论依据:原文说明"在所有提交的请求中带上这个Token,同时服务器端判断请求中的Token和cookie中的一致即可,拒绝匹配不一致的请求,因为黑客无法猜到这个Token值,所以也就无法被利用了",直接支撑本卡片结论。
- 原始内容:需要做的是在所有提交的请求中带上这个Token,同时服务器端判断请求中的Token和cookie中的一致即可,拒绝匹配不一致的请求,因为黑客无法猜到这个Token值,所以也就无法被利用了。