CSRF修复——看完的你多了一把刷子

近期项目对漏洞修复这一块比较看重,例举下CSRF的修复之路吧(提到我就心累)

1、CSRF是什么

      CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一。其他安全隐患,比如 SQL 脚本注入,跨站域脚本攻击等在近年来已经逐渐为众人熟知,很多网站也都针对他们进行了防御。然而,对于大多数人来说,CSRF 却依然是一个陌生的概念。即便是大名鼎鼎的 Gmail, 在 2007 年底也存在着 CSRF 漏洞,从而被黑客攻击而使 Gmail 的用户造成巨大的损失

2、如何进行攻击

   2.1、 攻击着首先要确定攻击的对象,并且分析要攻击的url。get请求的可以嵌在img标签,对于post可以使用表单和ajax。

   2.2、 攻击着将要攻击的url嵌入在自己网站,并且诱使要攻击的对象来访问自己的网站。

   2.3 、攻击要满足以下条件 :

      2.3.1、用户登录受信任的网站A,并在本地生成cookie。

      2.3.2在不登出的A的情况下,访问危险网站B,B网站嵌入要攻击A网站的请求,这时浏览器将带着用户在A网站生成的cookie,向A网站发起了请求。

      2.3.3网站A是从cookie取出认证信息,进行验证用户是否合法。

3、防范方案

在业界目前防御 CSRF 攻击主要有以下策略:

1、验证 HTTP Referer 字段;

2、在请求地址或者请求头添加 token 并验证; (本次防御将结合上面两种策略进行整改)

4、详细方案

     4.1、验证 HTTP Referer 字段方案

     整改的方法:在后台添加请求的过滤器,从而将每个请求的Referer头与受信任的Referer集合进行验证。验证不通过转发到登录页面。

     该方案也有一定的缺陷,因为目前已经有一些方法可以篡改 Referer 值,因此需要配合在请求地址或者请求头添加 token 并验证方案来预防CSRF。

      4.2、在请求地址中添加 token 并验证的方案

      4.2.1 、在用户登录成功的时候,生成csrftk,保存在cookie和session。

      4.2.2 、前端对post请求添加csrftk和returnType参数或者请求头,csrftk在发送请求前从cookie中动态的获取。(ps: returnType “0” 返回40001错误状态码, “1”返回token过期页面)

      4.2.3 、对于表单的post请求,在触发提交按钮之前动态添加隐藏域。

      4.2.4 、对于ajax的post请求,在触发提交按钮之前在$.ajax里添加beforeSend属性来动态的添加请求头csrftk和returnType

      4.2.5 、在后台添加拦截器,拦截post,get请求,但不拦截登录请求和静态资源。

      4.2.6 、对于post请求需要验证token,get和post请求都需要重新生成token,并将csrftk保存在cookie和session。

5、整改注意点

       5.1、修改的数据的请求统一改成post的方式,对于查询的请求使用get方式,前后端请求类型得一致

       5.2、拦截器无需拦截静态资源和登录接口, 对于post请求需要验证token,get和post请求都需要重新生成token,并将csrftk保存在cookie和session。

       5.3、前端post请求添加请求参数token或者请求头token,切勿漏掉。

       5.4、添加一个参数表明token认证不通过的情况,返回的页面还是错误状态码。

       5.5、对于前端a标签修改数据的,需要整改成ajax的形式,并且设置post

       5.6、前端token的获取的时候,要等到触发提交按钮的时候再动态的获取token,因为token是实时在变化的,必须确保发送请求前的得到的token是最新的,值得注意的是,如果提交表单需要后台验证数据,需要确保验证的请求是同步的,已免因为两个异步的请求同时发送,导致会有一个请求的token过期。

6、整改点,示例

流程图说明:

     1、后台添加拦截器

    

     2.token验证方法

    3.重新生成token,并将token刷新到cookie和session

    4.前端封装获取cookie的方法,和form表单添加csrftk和returnType的隐藏域

     5.修改数据的请求,ajax设置post,并且设置csrftk和returnType请求头,并根据错误状态码弹出提示信息

     6.点击表单提交按钮时,动态添加隐藏域

    7.修改数据的请求,前端后台使用post

注:转载请说明出处https://blog.csdn.net/PanZiHao_BeiJing/article/details/100555945

 

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在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漏洞的方法,为了确保应用程序的安全,建议结合多种措施来提高防御的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值