安全测试的老弟说我的系统不抗揍

本文讲述了在安全测试中遇到的三个典型问题:IP伪造、登录未使用验证码以及DDoS攻击,并提供了相应的解决方案。对于IP伪造,通过获取remoteAddr来获取真实IP;登录增加了验证码功能,采用Hutool生成验证码;对于DDoS攻击,通过网关限流和应用限流来防御。
摘要由CSDN通过智能技术生成

Hello,这里是爱 Coding,爱 Hiphop,爱喝点小酒的 AKA 柏炎。

我们部门每次大版本发布,都需要走一道公司的安全测试。

这不最近公司的安全测试标准提高了,我所负责的用户服务被一口气提了10个安全问题。

image-20220109142604456

好家伙,3.25没跑了。

img

不过用户中心是核心的底层业务服务,它的数据安全性与系统稳定性都是极其重要的,发现了Bug,我们只能逐个去修复了。

本文将针对其中比较典型三个问题做分析与解决方案阐述。

image-20220109102353145

一、IP伪造

日常业务开发的过程中,我们可能会需要获取请求接口的用户IP信息。

为了防止黑客通过爆破的方式登陆系统,我将记录每一次用户登陆的IP,在一定时间范围内连续输入错误的用户名或者密码,将锁定IP。此IP在锁定时间内无法再请求登陆接口。

修复前获取IP逻辑

  static String getIpAddr(HttpServletRequest request) {
         if (request == null) {
             return "unknown";
         }
         String ip = request.getHeader("x-forwarded-for");
         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
             ip = request.getHeader("Proxy-Client-IP");
         }
         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
             ip = request.getHeader("X-Forwarded-For");
         }
         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
             ip = request.getHeader("WL-Proxy-Client-IP");
         }
         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
             ip = request.getHeader("X-Real-IP");
         }
  
         return "0:0:0:0:0:0:0:1".equals(ip) ? LOCAL_IP : ip;
 }
复制代码

从业务功能使用的角度上来看,这段代码没有任何问题,我们能够从HttpServletRequest中获取到报文中的IP数据。

但是发现没有,我们获取的IP数据都是从请求头中获取的,而请求头的所有报文信息都是可以通过报文进行伪造的。只要攻击的黑客弄一个IP池,不断的变化,我们的防爆破机制就失效了。

解决思路

说实话,我当时为了完成这个IP获取需求,上面的代码也是直接百度了一份,发现能用也就用了。

我并不知道Header中获取到的IP值的意思是什么(文中不阐述比如ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值