为什么最后这俩条规则要放一起呢?因为这俩条规则是CSRF防御的技术核心,前后端代码配合一起作用,才能防御CSRF攻击 。单独仅前端或后端防御肯定行不通 。
首先,为什么要给请求增加header呢?因为受害者在访问邪恶网页时,受害者向我们的服务器所发出的请求,该请求和邪恶网页的域名一定是不同的,这也是CSRF中的Cross-Site的含义 。因此受到跨域的限制,攻击者无法改变该请求的任何信息,特别是受害者的业务cookie值 。
所以我们在浏览器端,给合法用户请求的header上加上csrf的参数,并且该参数的值由业务cookie计算得出 。如此则攻击者无法事先知道受害者的cookie,也就无法计算出header的csrf参数 。
然后在服务器端获取业务cookie以及header中的csrf值进行匹配校验,一致则认为是有效请求,不一致则认为是CSRF攻击进行拦截 。
规则6:可以使用专门的CSRF cookie替换业务cookie,但要保证cookie足够随机、无法被预测
针对某些网站,其业务cookie因安全原因或其他历史原因设置为httponly,导致JavaScript无法读取 。此时我们需要在nodejs端生成一个可以被JavaScript读取的cookie,专门负责处理CSRF逻辑 。
具体实现
上述规则可以用如下代码逻辑实现(代码仅供逻辑展示,均已脱敏仅供参考) 。
这里我们选用了koa2,将判断逻辑抽象成一个函数,返回true时代表截获到了CSRF攻击 。
文章插图
然后在业务代码里应用该方法,对CSRF攻击返回403状态码 。需要注意的是根据koa2的洋葱模型,下面代码应该放置在post路由中间件之前 。
文章插图
这里可以根据业务需要,适当拓展防御措施,如根据CSRF攻击的频次考虑增加校验码流程,或对IP进行限制 。此处不做详述 。
作者简介:
贾建容,58金融前端负责人,主要负责金融中后台系统架构和建设 。
推荐阅读
- 牡蛎和生蚝的区别有哪些?
- 为什么无花果是凶树?
- 3分钟看懂,如何解决Twitter分享索权过多的问题
- Linux 软链接的使用和具体演示
- Apache Kylin的Cube原理和优化
- 程序员也需了解的主流云计算网络架构
- web应用防火墙是做什么的?与传统网络设备的区别
- 搞微服务用阿里开源的 Nacos 真香啊
- 萨摩耶毛发黄怎么办 萨摩耶的毛变黄是为什么
- 在国外狗算家庭成员吗 狗在美国的地位