您当前的位置:首页 > 电脑百科 > 安全防护 > 服务器/网站

网站被攻击,恶意ip疯狂访问怎么办?

时间:2019-06-19 14:43:12  来源:  作者:

1

火车票抢票软件大家都知道,相信大多数人都用过,什么智行,携程,飞猪,都有抢票功能,尤其是在节假日,大家为了抢票,纷纷各种转发,加钱,升级自己的抢票级别,其实背后的机制就是疯狂的调12306的订票接口,调的频率高,抢到票的几率就高,12306也发表声明,这种疯狂调接口的平台12306已经做了限制。

做限制,无外乎就是限制ip访问频率,要不就是控制接口最大并发量,有些恶意攻击就是疯狂调接口,把你接口调的欲哭无泪,下面就来写一个限制ip访问的机制。

2

这个限制ip访问机制就是通过控制ip一段时间访问次数如果超过这个次数,就将该ip拉入黑名单一段时间,等限制时间结束,再移出黑名单。

首先我们创建一个监听器,这个监听器的作用就是在初始化项目时进行一些基础信息的创建。

@JAVAx.servlet.annotation.WebListener
public class WebListener implements ServletContextListener {
 public void contextInitialized(ServletContextEvent servletContextEvent) {
 Logger logger = LoggerFactory.getLogger(WebListener.class);
 logger.info("Project初始化成功");
 ServletContext context = servletContextEvent.getServletContext();
 // IP存储器
 Map<String, Long[]> ipMap = new ConcurrentHashMap<String, Long[]>();
 context.setAttribute("ipMap", ipMap);
 // 限制IP存储器:存储被限制的IP信息
 Map<String, Long> limitedIpMap = new HashMap<String, Long>();
 context.setAttribute("limitedIpMap", limitedIpMap);
 logger.info("ipmap:"+ipMap.toString()+";limitedIpMap:"+limitedIpMap.toString()+"初始化成功。。。。。");
 }
 public void contextDestroyed(ServletContextEvent servletContextEvent) {
 }
}

这个监听器的作用就是初始化一个Ip存储器和限制IP存储器,Ip存储器就是将请求来的ip进行存储,限制IP存储器就是将被拉入黑名单的ip进行存储。

Ip存储器创建好之后就是要创建过滤器,我们实现ip限制就是依靠过滤器进行实现,创建一个过滤器,设置对所有请求进行拦截。

@WebFilter(urlPatterns = "/*")
public class IpFilter implements Filter {

这个@WebFilter注解就是设置拦截器的拦截范围

接着我们就主要是在doFilter方法里实现我们的ip限制功能,ip限制通过默认限制时间,ip连续访问阀值,用户最小访问安全时间这三点进行灵活控制。

public class IpFilter implements Filter {
 /**
 * 默认限制时间(单位:ms)
 */
 private static final long LIMITED_TIME_MILLIS = 60 * 1000;
 /**
 * 用户连续访问最高阀值,超过该值则认定为恶意操作的IP,进行限制
 */
 private static final int LIMIT_NUMBER = 5;
 /**
 * 用户访问最小安全时间,在该时间内如果访问次数大于阀值,则记录为恶意IP,否则视为正常访问
 */
 private static final long MIN_SAFE_TIME = 60 * 1000;
 private FilterConfig config;
 public void init(FilterConfig config) throws ServletException {
 this.config = config;
 }
public class IpFilter implements Filter {
 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
 ServletContext context = config.getServletContext();
 // 获取限制IP存储器:存储被限制的IP信息
 Map<String, Long> limitedIpMap = (Map<String, Long>) context.getAttribute("limitedIpMap");
 // 过滤受限的IP
 filterLimitedIpMap(limitedIpMap);
 /**
 * @param limitedIpMap
 * @Description 过滤受限的IP,剔除已经到期的限制IP
 */
 private void filterLimitedIpMap(Map<String, Long> limitedIpMap) {
 if (limitedIpMap == null) {
 return;
 }
 Set<String> keys = limitedIpMap.keySet();
 Iterator<String> keyIt = keys.iterator();
 long currentTimeMillis = System.currentTimeMillis();
 while (keyIt.hasNext()) {
 long expireTimeMillis = limitedIpMap.get(keyIt.next());
 if (expireTimeMillis <= currentTimeMillis) {
 keyIt.remove();
 }
 }
 }

首先我们需要获取ip存储器,然后对当前的限制ip进行过滤,看是否有已经超过默认时间的ip,将其从限制ip中移除。

 // 获取用户IP
 String ip = IpUtil.getIpAddr(request);
 System.err.println("ip:" + ip);
 // 判断是否是被限制的IP,如果是则跳到异常页面
 if (isLimitedIP(limitedIpMap, ip)) {
 long limitedTime = limitedIpMap.get(ip) - System.currentTimeMillis();
 // 剩余限制时间(用为从毫秒到秒转化的一定会存在些许误差,但基本可以忽略不计)
 request.setAttribute("remainingTime", ((limitedTime / 1000) + (limitedTime % 1000 > 0 ? 1 : 0)));
 //request.getRequestDispatcher("/error/overLimitIP").forward(request, response);
 System.err.println("ip访问过于频繁:" + ip + "当前时间" + System.currentTimeMillis());
 return;
 }
 /**
 * @param limitedIpMap
 * @param ip
 * @return true : 被限制 | false : 正常
 * @Description 是否是被限制的IP
 */
 private boolean isLimitedIP(Map<String, Long> limitedIpMap, String ip) {
 if (limitedIpMap == null || ip == null) {
 // 没有被限制
 return false;
 }
 Set<String> keys = limitedIpMap.keySet();
 Iterator<String> keyIt = keys.iterator();
 while (keyIt.hasNext()) {
 String key = keyIt.next();
 if (key.equals(ip)) {
 // 被限制的IP
 return true;
 }
 }
 return false;
 }

接着就要判断当前访问的ip是否在限制Ip名单内,如果在,就进行拦截,不让其进行访问。

 // 获取IP存储器
 Map<String, Long[]> ipMap = (Map<String, Long[]>) context.getAttribute("ipMap");
 // 判断存储器中是否存在当前IP,如果没有则为初次访问,初始化该ip
 // 如果存在当前ip,则验证当前ip的访问次数
 // 如果大于限制阀值,判断达到阀值的时间,如果不大于[用户访问最小安全时间]则视为恶意访问,跳转到异常页面
 if (ipMap.containsKey(ip)) {
 Long[] ipInfo = ipMap.get(ip);
 ipInfo[0] = ipInfo[0] + 1;
 System.out.println("当前第[" + (ipInfo[0]) + "]次访问");
 if (ipInfo[0] > LIMIT_NUMBER) {
 Long ipAccessTime = ipInfo[1];
 Long currentTimeMillis = System.currentTimeMillis();
 if (currentTimeMillis - ipAccessTime <= MIN_SAFE_TIME) {
 limitedIpMap.put(ip, currentTimeMillis + LIMITED_TIME_MILLIS);
 request.setAttribute("remainingTime", LIMITED_TIME_MILLIS);
 System.err.println("ip访问过于频繁:" + ip);
 request.getRequestDispatcher("/views/error.jsp").forward(request, response);
 return;
 } else {
 //初始化用户访问次数和访问时间
 initIpVisitsNumber(ipMap, ip);
 }
 }
 //当ip访问时间与上一次访问时间相隔一分钟时,对该ip的访问次数,和时间进行重置
 updateCurrentTimeIp(ipMap, ip);
 } else {
 //初始化用户访问次数和访问时间
 initIpVisitsNumber(ipMap, ip);
 System.out.println("您首次访问该网站");
 }
 context.setAttribute("ipMap", ipMap);
 chain.doFilter(request, response);
 /**
 * 初始化用户访问次数和访问时间
 *
 * @param ipMap
 * @param ip
 */
 private void initIpVisitsNumber(Map<String, Long[]> ipMap, String ip) {
 Long[] ipInfo = new Long[3];
 ipInfo[0] = 0L;// 访问次数
 ipInfo[1] = System.currentTimeMillis();// 初次访问时间
 ipInfo[2] = System.currentTimeMillis();
 ipMap.put(ip, ipInfo);
 }
 /**
 * @param updateCurrentTimeIp
 * @Description 当ip访问时间与上一次访问时间相隔一分钟时,对该Ip的访问次数,和时间进行重置
 */
 private void updateCurrentTimeIp(Map<String, Long[]> ipMap, String ip) {
 Long[] ipInfo = ipMap.get(ip);
 Long ipAccessTime = ipInfo[2];
 Long currentTimeMillis = System.currentTimeMillis();
 if (ipAccessTime != 0 && (currentTimeMillis - ipAccessTime) >= MIN_SAFE_TIME) {
 System.out.println("进来了");
 Long[] longs = ipMap.get(ip);
 longs[0] = 0l;
 longs[1] = System.currentTimeMillis();
 longs[2] = System.currentTimeMillis();
 }
 }

最后就是要判断该存储器中有没有当前ip,没有就要存到ip存储器中,有的话就要根据当前ip访问次数和到达阀值时间进行判断是否需要拦截,这里有个ipUtil代码我没放上来,我现在方桑来,方便大家直接拿去用,是一个简单获取访问ip的工具类。

/*
* ip访问限制,限制ip每分钟访问次数
*
*
* */
public class IpUtil {
 public static String getIpAddr(ServletRequest servletRequest) {
 HttpServletRequest request=(HttpServletRequest) servletRequest;
 String ipAddress = null;
 try {
 ipAddress = request.getHeader("x-forwarded-for");
 if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
 ipAddress = request.getHeader("Proxy-Client-IP");
 }
 if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
 ipAddress = request.getHeader("WL-Proxy-Client-IP");
 }
 if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
 ipAddress = request.getRemoteAddr();
 if (ipAddress.equals("127.0.0.1")) {
 // 根据网卡取本机配置的IP
 InetAddress inet = null;
 try {
 inet = InetAddress.getLocalHost();
 } catch (Exception e) {
 e.printStackTrace();
 }
 ipAddress = inet.getHostAddress();
 }
 }
 // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
 if (ipAddress != null && ipAddress.length() > 15) { // "***.***.***.***".length()
 // = 15
 if (ipAddress.indexOf(",") > 0) {
 ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
 }
 }
 } catch (Exception e) {
 ipAddress="";
 }
 // ipAddress = this.getRequest().getRemoteAddr();
 return ipAddress;
 }
}

启动项目进行测试访问

您首次访问该网站
ip:192.168.137.1
当前第[2]次访问
当前第[3]次访问
ip:192.168.137.1
ip:192.168.137.1
当前第[4]次访问
当前第[5]次访问
ip:192.168.137.1
ip:192.168.137.1
ip访问过于频繁:192.168.137.1
当前第[6]次访问
ip:192.168.137.1
ip访问过于频繁:192.168.137.1当前时间1560790500409

通过上述步骤,我们的ip限制访问功能就已经实现了,控制ip访问其实在很多公司项目中都是会用到的,尤其是B2C,C2C这样的项目,ip访问拦截可以有效防止恶意攻击,我这个写的也是相对比较简单的,在应对高并发,微服务,负载集群项目时还需要进行改进,尤其在ip存储和限制ip存储可以考虑用redis进行实现,后期如果有时间我也会将其扩展成更实用更符合现在主流项目形式的ip访问限制功能。

网站被攻击,恶意ip疯狂访问怎么办?

 



Tags:网站   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
随着互联网的普及及技术的改革,现在所有的考试从注册报名,考务文件查询,准考证下载打印、考试成绩查询和各种的信息的发布都是在网上发布的。以下这几个网站,是所有考证人都必须...【详细内容】
2021-12-24  Tags: 网站  点击:(5)  评论:(0)  加入收藏
不会写文章?写文案没灵感,不知道写什么?【网创智慧库】分享给你15个文案高手都在用的高质量文案素材网站,记得收藏保存! 今日热榜今日热榜是一个综合各大平台的热门实时话题排行...【详细内容】
2021-12-24  Tags: 网站  点击:(11)  评论:(0)  加入收藏
对于一些文章页面来说,想要得到提升页面进行整体质量度,除了优化研究文章主体主要内容之外,调用相关分析文章也是企业优化的重点。那么我们具体怎么调用相关文章呢,星宇SEO今天...【详细内容】
2021-12-22  Tags: 网站  点击:(6)  评论:(0)  加入收藏
前言传统的 DDOS 防御通常使用“硬抗”的方式,导致开销很大,而且有时效果并不好。例如使用 DNS 切换故障 IP 的方案,由于域名会受到缓存等因素的影响通常有分钟级延时,前端难以...【详细内容】
2021-12-21  Tags: 网站  点击:(19)  评论:(0)  加入收藏
在最近的一波攻击中,黑客利用多个插件中未修补的漏洞攻击了 160 万个 WordPress 网站。 易受攻击的插件对 WordPress 网站产生了的巨大攻击数据。 Wordfence 最近发现 WordPr...【详细内容】
2021-12-16  Tags: 网站  点击:(9)  评论:(0)  加入收藏
今年以来,国家网信办针对一些粉丝量大、关注度高的网站平台“头部账号”法纪意识淡薄,滥用网上影响力,传播错误导向内容,污染网络生态等突出问题,会同相关部门,指导各地网信办,要求...【详细内容】
2021-12-16  Tags: 网站  点击:(8)  评论:(0)  加入收藏
经常和大家分享PPT技巧,不知道大家有没有进步?今天直接来个重磅分享。你知道,一些大厂的路演、发布会PPT的设计师,平时浏览什么设计网站吗? 作为PPT设计师,平时也会看一些创意设计...【详细内容】
2021-12-15  Tags: 网站  点击:(21)  评论:(0)  加入收藏
据BleepingComputer消息,亚马逊在12月8日宣布,将关闭其运营了25年的全球网站排名系统“Alexa.com”。Alexa.com是亚马逊的子公司,以全球排名系统而闻名,该系统通过分析来自其合...【详细内容】
2021-12-15  Tags: 网站  点击:(7)  评论:(0)  加入收藏
一、背景介绍DirBuster是用来探测web服务器上的目录和隐藏文件的。因为DirBuster是采用java编写的,所以运行前要安装上java的环境。 来看一下基本的使用: ①:TargetURL下输入要...【详细内容】
2021-12-07  Tags: 网站  点击:(28)  评论:(0)  加入收藏
最近发现B2B的海外推广貌似是一个挺大的缺口,很多厂长或老板不了解独立站的流量构成和玩法,无论是自然流量还是付费流量。也衍生了很多培训(咦,这是不是我副业的好机会?)所以这次...【详细内容】
2021-11-11  Tags: 网站  点击:(32)  评论:(0)  加入收藏
▌简易百科推荐
在最近的一波攻击中,黑客利用多个插件中未修补的漏洞攻击了 160 万个 WordPress 网站。 易受攻击的插件对 WordPress 网站产生了的巨大攻击数据。 Wordfence 最近发现 WordPr...【详细内容】
2021-12-16  蚁安    Tags:WordPress   点击:(9)  评论:(0)  加入收藏
事件起因从安全分析系统里面发现一条带有病毒的下载,然后针对这条记录展开了一系列的分析分析过程1.登录到被感染服务器,查看系统状况,hadoop 这个用户在 2020/6/18 20:32 从这...【详细内容】
2021-11-23  Z2990Lig    Tags:SSH   点击:(32)  评论:(0)  加入收藏
1、除了服务器需要用的一些正规软件,其它都不要安装。2、在用户中把administrator改名,这样做的目的是即使对方暴破了我们的密码用户名也不容易猜住,相当于又加了一道关卡。...【详细内容】
2021-11-01  IT小哥吧    Tags:服务器   点击:(37)  评论:(0)  加入收藏
账户安全(1)更名administrator本地用户并禁用guest账户步骤:点击“开始”,找到“管理工具”,点击里面的“计算机管理”,找到“本地用户和组” (2)设定账户锁定策略尝试5次失败...【详细内容】
2021-10-12  Kali与编程  今日头条  Tags:Windows主机   点击:(62)  评论:(0)  加入收藏
本文主要介绍以Microsoft的Windows Server 2019 ,版本:Datacenter(Domain Controller)安全加固保护.企业随着规模不断扩大,业务增多,信息安全建设是企业里一条只有重点没有终点...【详细内容】
2021-09-17  Vireshark    Tags:服务器安全   点击:(64)  评论:(0)  加入收藏
目录常见共享命令IPC$IPC$的利用条件1:开启了139、445端口2:目标主机开启了IPC$共享3:IPC连接报错IPC空连接空连接可以做什么?(毫无作用)IPC$非空连接IPC$非空连接可以做什么?di...【详细内容】
2021-09-16  网络说安全    Tags:系统安全   点击:(86)  评论:(0)  加入收藏
昨天一个老哥找到我,说他的服务器这几天一直被CC攻击,问我这边有没有什么解决的方法? 近年来,网络攻击事件越来越频繁,最常见的就是CC攻击和DDOS攻击,主要的区别就是针对的对象不...【详细内容】
2021-09-10  小蚁GDRAGON    Tags:cc攻击   点击:(58)  评论:(0)  加入收藏
网站页面上的登录操作,通常都是输入帐号密码,传输至网站后台验证。在网站页面、数据传输中,通过技术手段,都可以得到用户输入的信息,并可以修改,从而发起网络攻击。典型的如:使用自...【详细内容】
2021-08-30  修丹道的程序猿    Tags:登录方式   点击:(62)  评论:(0)  加入收藏
网络安全研究人员披露了一类影响主要 DNS 即服务 (DNSaaS) 提供商的新漏洞,这些漏洞可能允许攻击者从企业网络中窃取敏感信息。基础设施安全公司 Wiz 的研究人员 Shir Tamar...【详细内容】
2021-08-12  零日时代    Tags:漏洞   点击:(66)  评论:(0)  加入收藏
001暴力破解1. 指定用户名爆破密码传统型爆破思路,用户名可以通过猜测或者信息收集获得。猜测:admin、网站域名等信息收集:新闻发布人、whoami等2. 指定密码爆破用户名如果是后...【详细内容】
2021-07-23  KaliMa  今日头条  Tags:登陆框   点击:(85)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条