一个express老系统csrf漏洞修复

一个运行快两年的express框架web系统,被安全部门审核存在csrf漏洞,项目使用的前后端分离的形式,所有功能操作,通过ajax调用后端接口来完成,查了很多资料,一个基本的防御思想就是验证随机数了,为什么随机数就可以实现csrf的防御呢?本文将针对该问题进行分解

什么是csrf

csrf(跨站请求伪造)是一种网络攻击方式,怎么实现这种攻击方式呢?
1.登录受信任网站A,并在本地生成Cookie
2.在不登出A的情况下,访问危险网站B,B站存在一个针对A站恶意的路由操作,如删除某条记录
用户操作后,就会删除造成对A站的攻击
如果不满足以上两个条件中的一个,就不会受到CSRF的攻击

示例1:
  银行网站A,它以GET请求来完成银行转账的操作,如:
http://www.mybank.com/Transfer.php?toBankId=11&money=1000
  危险网站B,它里面有一段HTML的代码如下:
  <img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>
  首先,你登录了银行网站A,然后访问危险网站B,噢,这时你会发现你的银行账户少了1000块......
虽然存在着巨大的不确定性,但是这种漏洞危害性也是巨大的

csrf的防御策略

针对以上的攻击方式,我们要采取防御措施

  • 验证 HTTP Referer 字段

HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站,比如需要访问 http://bank.example/withdraw?...,用户必须先登陆 bank.example,然后通过点击页面上的按钮来触发转账事件。这时,该转帐请求的 Referer 值就会是转账按钮所在的页面的 URL,通常是以 bank.example 域名开头的地址。而如果黑客要对银行网站实施 CSRF 攻击,他只能在他自己的网站构造请求,当用户通过黑客的网站发送请求到银行时,该请求的 Referer 是指向黑客自己的网站。因此,要防御 CSRF 攻击,银行网站只需要对于每一个转账请求验证其 Referer 值,如果是以 bank.example 开头的域名,则说明该请求是来自银行网站自己的请求,是合法的。如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。
由于Referer可以篡改,所以这种方案安全性较低。

  • 验证码的方式

每一次操作前添加验证码,该种方案较繁琐,一般不会采用。

  • 随机数验证

现在csrf防御主要采用该种方式,基本流程

  1. 服务端产生一个随机数,发送到客户端
  2. 客户端在表单提交时,携带该随机数
  3. 在服务端验证该随机数

基本的防御思想就是这样的流程,那么怎么来怎么实现这样的业务代码。

由于项目是一个老的系统,所以采取切面处理的方式,

  1. 在服务端生成一个随机数csrf,然后加密生成csrftoken,然后将这两个值发送到客户端
  2. 在请求时将header中携带csrftoken
  3. 服务端验证加密后csrf和csrftoken是否相等

该种方案略显复杂,精简一下

  1. 服务生成一个随机数token,设置cookie
  2. 在客户端生成经过md5(token)生成一个csrftoken,在请求时携带在header中
  3. 在服务端,取cookie中的token,经过md(token)算法后和header中的csrftoken做比较
在Python中,常见的修复CSRF(跨站请求伪造)漏洞的方法如下: 1. 随机令牌:为了防止CSRF攻击,可以在每个用户会话中生成一个随机的令牌,并将令牌添加到每个表单请求中作为隐藏字段或cookie。服务器在接收到请求后,会验证令牌的有效性,如果不匹配则拒绝请求。 2. Referer检查:在接收到请求时,服务器可以检查Referer头信息,该头信息显示了请求的来源页面。如果来源页面与当前请求的页面不匹配,则可以拒绝请求。但需要注意的是,Referer头信息有时会被浏览器禁用或篡改,因此不能完全依赖该方法来防止CSRF攻击。 3. Samesite Cookie属性:在Python的Web框架中,可以使用Samesite Cookie属性来解决CSRF问题。设置Cookie的Samesite属性为"Strict"或"Lax"可以限制Cookie只能在同一站点下才能发送,从而避免了跨站点的请求伪造。 4. 双重提交令牌:一种常用的方式是将令牌存储在服务器端的会话中,并将其作为隐藏字段和cookie的值发送给客户端。当表单提交时,服务器验证表单中的令牌与会话中的令牌是否匹配,如果匹配则接受请求,否则拒绝请求。 5. 使用验证码:在某些敏感操作(如支付、修改密码)中,可以要求用户输入验证码。这样即使存在CSRF攻击,攻击者也无法成功地执行敏感操作。 以上是一些常见的Python修复CSRF漏洞的方法,为了确保应用程序的安全,建议结合多种措施来提高防御的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值