- 浏览: 473103 次
- 性别:
- 来自: 长沙
文章分类
最新评论
-
Source_野驴:
...
jsp静态化和伪静态化 -
zidanzzg:
很好的知识,找到了利用异或交换数值的理论支持,谢谢分享
XOR的性质和运算 -
ueseu:
引用(2) DomainDomain域名也是Cookie的一部 ...
Cookie的组成 -
ueseu:
引用Secure取true或者false值。如果为true,那 ...
Cookie的组成 -
liqi___123:
理解得很透彻,谢谢!!
ROLAP、MOLAP和HOLAP联机分析处理区别
在Java Web应用程中,特别是网站开发中,我们有时候需要为应用程序增加一个入侵检测程序来防止恶意刷新的功能,防止非法用户不断的往Web应用中重复发送数据。当然,入侵检测可以用很多方法实现,包括软件、硬件防火墙,入侵检测的策略也很多。在这里我们主要介绍的是Java Web应用程序中通过软件的方式实现简单的入侵检测及防御。
该方法的实现原理很简单,就是用户访问Web系统时记录每个用户的信息,然后进行对照,并根据设定的策略(比如:1秒钟刷新页面10次)判断用户是否属于恶意刷新。
我们的入侵检测程序应该放到所有Java Web程序的执行前,也即若发现用户是恶意刷新就不再继续执行Java Web中的其它部分内容,否则就会失去了意义。这就需要以插件的方式把入侵检测的程序置入Java Web应用中,使得每次用户访问Java Web,都先要到这个入侵检测程序中报一次到,符合规则才能放行。
Java Web应用大致分为两种,一种纯JSP(+Java Bean)方式,一种是基于框架(如Struts、EasyJWeb等)的。第一种方式的Java Web可以通过Java Servlet中的Filter接口实现,也即实现一个Filter接口,在其doFilter方法中插入入侵检测程序,然后再web.xml中作简单的配置即可。在基于框架的Web应用中,由于所有应用都有一个入口,因此可以把入侵检测的程序直接插入框架入口引擎中,使框架本身支持入侵检测功能。当然,也可以通过实现Filter接口来实现。
在EasyJWeb框架中,已经置入了简单入侵检测的程序,因此,这里我们以EasyJWeb框架为例,介绍具体的实现方法及源码,完整的代码可以在EasyJWeb源码中找到。
在基于EasyJWeb的Java Web应用中(如http://www.easyjf.com/bbs/),默认情况下你只要连续刷新页面次数过多,即会弹出如下的错误:
EasyJWeb框架友情提示!:-):
您对页面的刷新太快,请等待60秒后再刷新页面!
详细请查询http://www.easyjf.com
二、用户访问信息记录UserConnect.java类
这个类是一个简单的Java Bean,主要代表用户的信息,包括用户名、IP、第一次访问时间、最后登录时间、登录次数、用户状态等。全部
代码如下:
package com.easyjf.web; import java.util.Date; /** *Title:用户验证信息 *Description:记录用户登录信息,判断用户登录情况 */ public class UserConnect { private String userName; private String ip; private Date firstFailureTime; private Date lastLoginTime; private int failureTimes;//用户登录失败次数 private int status=0;//用户状态0表示正常,-1表示锁定 public int getFailureTimes() { return failureTimes; } public void setFailureTimes(int failureTimes) { this.failureTimes = failureTimes; } public Date getFirstFailureTime() { return firstFailureTime; } public void setFirstFailureTime(Date firstFailureTime) { this.firstFailureTime = firstFailureTime; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public Date getLastLoginTime() { return lastLoginTime; } public void setLastLoginTime(Date lastLoginTime) { this.lastLoginTime = lastLoginTime; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } }
三、监控线程UserConnectManage.java类
这是入侵检测的核心部分,主要实现具体的入侵检测、记录、判断用户信息、在线用户的刷新等功能,并提供其它应用程序使用本组件的调用接口。
package com.easyjf.web; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; import org.apache.log4j.Logger; /** *Title:用户入侵检测信息 *Description:用于判断用户刷新情况检查,默认为10秒钟之内连续连接10次为超时 ** @version 1.0 */ public class UserConnectManage { private static final Logger logger = (Logger) Logger.getLogger(UserConnectManage.class.getName()); private static int maxFailureTimes=10;//最大登录失败次数 private static long maxFailureInterval=10000;//毫秒,达到最大登录次数且在这个时间范围内 private static long waitInterval=60000;//失败后接受连接的等待时间,默认1分钟 private static int maxOnlineUser=200;//同时在线的最大数 private final static Map users=new HashMap();//使用ip+userName为key存放用户登录信息UserLoginAuth private static Thread checkThread=null; private static class CheckTimeOut implements Runnable{ private Thread parentThread; public CheckTimeOut(Thread parentThread) { this.parentThread=parentThread; synchronized(this){ if(checkThread==null){ checkThread= new Thread(this); //System.out.println("创建一个新线程!"); checkThread.start(); } } } public void run() { while(true) { if(parentThread.isAlive()){ try{ Thread.sleep(2000); int i=0; if(users.size()>maxOnlineUser)//当达到最大用户数时清除 { synchronized(users){//执行删除操作 Iterator it=users.keySet().iterator(); Set set=new HashSet(); Date now=new Date(); while(it.hasNext()) { Object key=it.next(); UserConnect user=(UserConnect)users.get(key); if(now.getTime()-user.getFirstFailureTime().getTime()>maxFailureInterval)//删除超时的用户 { set.add(key); logger.info("删除了一个超时的连接"+i); i++; } } if(i<5)//如果删除少于5个,则强行删除1/2在线记录,牺牲性能的情况下保证内存 { int num=maxOnlineUser/2; it=users.keySet().iterator(); while(it.hasNext() && i { set.add(it.next()); logger.info("删除了一个多余的连接"+i); i++; } } users.keySet().removeAll(set); } } } catch(Exception e) { e.printStackTrace(); } } else { break; } } logger.info("监视程序运行结束!"); } } //通过checkLoginValidate判断是否合法的登录连接,如果合法则继续,非法则执行 public static boolean checkLoginValidate(String ip,String userName)//只检查认证失败次数 { boolean ret=true; Date now=new Date(); String key=ip+":"+userName; UserConnect auth=(UserConnect)users.get(key); if(auth==null)//把用户当前的访问信息加入到users容器中 { auth=new UserConnect(); auth.setIp(ip); auth.setUserName(userName); auth.setFailureTimes(0); auth.setFirstFailureTime(now); users.put(key,auth); if(checkThread==null)new CheckTimeOut(Thread.currentThread()); } else { if(auth.getFailureTimes()>maxFailureTimes) { //如果在限定的时间间隔内,则返回拒绝用户连接的信息 if((now.getTime()-auth.getFirstFailureTime().getTime()) { ret=false; auth.setStatus(-1); } else if(auth.getStatus()==-1 && (now.getTime()-auth.getFirstFailureTime().getTime()<(maxFailureInterval+waitInterval)))//重置计数器 { ret=false; } else { auth.setFailureTimes(0); auth.setFirstFailureTime(now); auth.setStatus(0); } } //登录次数加1 auth.setFailureTimes(auth.getFailureTimes()+1); } //System.out.println(key+":"+auth.getFailureTimes()+":"+ret+":"+(now.getTime()-auth.getFirstFailureTime().getTime())); return ret; } public static void reset(String ip,String userName)//重置用户信息 { Date now=new Date(); String key=ip+":"+userName; UserConnect auth=(UserConnect)users.get(key); if(auth==null)//把用户当前的访问信息加入到users容器中 { auth=new UserConnect(); auth.setIp(ip); auth.setUserName(userName); auth.setFailureTimes(0); auth.setFirstFailureTime(now); users.put(key,auth); } else { auth.setFailureTimes(0); auth.setFirstFailureTime(now); } } public static void remove(String ip,String userName)//删除用户在容器中的记录 { String key=ip+":"+userName; users.remove(key); } public static void clear()//清空容器中内容 { if(!users.isEmpty())users.clear(); } public static long getMaxFailureInterval() { return maxFailureInterval; } public static void setMaxFailureInterval(long maxFailureInterval) { UserConnectManage.maxFailureInterval = maxFailureInterval; } public static int getMaxFailureTimes() { return maxFailureTimes; } public static void setMaxFailureTimes(int maxFailureTimes) { UserConnectManage.maxFailureTimes = maxFailureTimes; } public static int getMaxOnlineUser() { return maxOnlineUser; } public static void setMaxOnlineUser(int maxOnlineUser) { UserConnectManage.maxOnlineUser = maxOnlineUser; } public static long getWaitInterval() { return waitInterval; } public static void setWaitInterval(long waitInterval) { UserConnectManage.waitInterval = waitInterval; } }
四、调用接口
在需要进入侵检测判断的地方,直接使用UserConnectManage类中的checkLoginValidate方法即可。如EasyJWeb的核心Servlet
com.easyjf.web.ActionServlet中调用UserConnectManage的代码:
if(!UserConnectManage.checkLoginValidate(request.getRemoteAddr(),"guest")) { info(request,response,new Exception("您对页面的刷新太快,请等待" +UserConnectManage.getWaitInterval()/1000+"秒后再刷新页面!")); return; }
五、总结
当然,这里提供的方法只是一个简单的实现示例,由于上面的用户信息是直接保存在内存中,若并发用户很大的时候的代码的占用,可以考虑引入数据库来记录用户的访问信息,当然相应的执行效率肯定用降低。上面介绍的实现中,入侵检测判断的策略也只有用户访问次数及时间间隔两个元素,您还可以根据你的实现情况增加其它的检测元素。
发表评论
-
java String.getBytes()编码问题 (讲到实处了)
2012-12-12 11:26 762转载自: String.getBytes()的问 ... -
JSP中文验证码
2012-05-14 17:18 1217以上两篇文章的内容介绍了有关JSP中产生数字验证码跟中文验证 ... -
One-Jar之旅
2011-09-16 10:06 1728One-Jar之旅 1 ... -
Javamail中的常见中文乱码问题与解决办法
2011-09-09 09:48 1575在使用javamail api开发邮件服务系统时,我们常常会碰 ... -
理解Java ClassLoader机制
2011-07-28 11:24 1347再次阅读这篇文章时,有了更深的体会,特转载之。 理解Ja ... -
JAVA泛型简介
2011-07-22 13:41 1193另篇:http://www.java3z.com/cwbweb ... -
BCEL和Javassist的介绍
2011-07-18 10:49 1537BCEL 介绍: Byte Code E ... -
类加载器特技:OSGi代码生成
2011-07-18 10:08 733转自:http://www.oschina.n ... -
开源的java编译器jikes
2011-06-19 08:50 2208今天才知道java编译器还有个jikes这样的开源产品。 ... -
java的沙盒机制
2011-01-28 18:03 2012JAVA 的安全模型不同于传统的安全方法,传统的安全方法中 ... -
filter的调用顺序
2011-01-06 11:54 1251在一个大型项目中往往有多个servlet过滤器,但是这些ser ... -
JAVA操作COOKIE
2010-12-28 11:32 12451.设置Cookie Cookie cookie = ... -
关于volatile变量的理解
2010-12-12 13:21 975前些日子在看些多线 ... -
关于Java 构造函数和继续特性的回顾
2010-12-06 09:21 1155java构造函数 java类库的设计者们通过提供 ... -
Java可变参数方法重载的错误3例
2010-12-05 23:28 1085JDK1.5引进了方法的可变参数,受到许多开发人员的青睐。 ... -
JDK1.5新特性
2010-12-05 23:19 687"JDK1.5"的一个重要主题就是 ... -
序列化中serialVersionUID的使用
2010-12-04 08:39 1307先来看一个例子: 定义一个bean: Java代码 ... -
Java 语言的 XPath API
2010-12-02 15:31 925如果要告诉别人买一加仑牛奶,您会怎么说?“请去买一加仑牛 ... -
java -verbose命令
2010-09-23 15:00 9355java -verbose[:class|gc|jni ... -
db2的jdbc驱动
2010-09-20 18:34 1232type1:jdbc-odbc桥 ...
相关推荐
在Java Web中的入侵检测及简单实现 java代码
在Java Web应用程中,特别是网站开发中,我们有时候需要为应用程序增加一个入侵检测程序来防止恶意刷新的功能,防止非法用户不断...在这里我们主要介绍的是Java Web应用程序中通过软件的方式实现简单的入侵检测及防御。
【毕业设计】基于监督学习的web入侵检测系统源码【毕业设计】基于监督学习的web入侵检测系统源码【毕业设计】基于监督学习的web入侵检测系统源码【毕业设计】基于监督学习的web入侵检测系统源码【毕业设计】基于监督...
本项目是一个用springboot+maven对海康sdk抓拍功能进行了二次开发,里面包含我自己的springboot项目、海康最新cs版sdk、最新web版sdk、项目的说明文档,可以实现摄像头的抓拍、预览、录像、对讲功能,亲测有效
毕业设计——基于监督学习的web入侵检测系统(0day收集器) ##机器学习方面 用的技术比较low,只是scikit-learn里面的svm用了一下,开始的时候用knn来着,当现在样本数量过万的时候发现knn的确吃力。 ##数据方面 ...
一个基于Spring / 的Web应用程序入侵检测和防御框架。 甚至像恐惧事件的先兆一样,当先驱们仍在命运之前,在预兆即将到来之际,让天地一起向我们的气候和同胞展示。 -莎士比亚的哈姆雷特 Harbinger检测到您的Web...
通过学习Spring Boot,我了解了现代化的Java Web开发方式,并通过实践构建了一些简单的Web应用程序。我还意识到在学习过程中遇到的困难和挑战是正常的,通过不断的努力和学习,我能够克服这些困难并取得进步。 在...
公爵遭遇Duke Encounters是一个完整的 Web 应用程序,它利用基于应用程序入侵检测。 这个 Web 应用程序使用带有内存数据库和 UI 的 。 请记住,所有输入的信息只是暂时存储,重新启动时会丢失。 使用mvn spring-boot...
通过深入研究系统的设计思路、架构和实现细节,您将能够全面了解使用Python构建Web应用程序的方法。源代码不仅是学习的资源, 还可作为技术分享和交流的平台,促进技术互动和知识共享。 在学习过程中,您将通过分析...
Web安全学习大纲 一、Web安全系列之基础 1、Web安全基础概念(1天) 互联网本来是安全的,自从有了研究安全的人之后,互联网就变的不安全了。 2、web面临的主要安全问题(2天) 客户端:移动APP漏洞、浏览器...
软件开发设计:PHP、QT、应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、...
《Web安全深度剖析》总结了当前流行的高危漏洞的形成原因、攻击手段及解决方案,并通过大量的示例代码复现漏洞原型,制作模拟环境,更好地帮助读者深入了解Web应用程序中存在的漏洞,防患于未然。 《Web安全深度剖析...
讲述WEB安全需求,WEB服务器的安全策略,分布式拒绝服务攻击的原理、工具和对策,CGI的的安全管理,Cookies及其安全,Java的安全性,加密技术在安全管理中的应用,WEB浏览器的安全,Apache服务器的安全性,IIS服务器...
实时的入侵检测及采取相应的防护手段,如记录证据用于跟踪和恢复、断开网络连接等。实时入侵检测能力之所以重要首先它能够对付来自内部网络的攻击,其次它能够缩短hacker入侵的时间。入侵检测系统可分为两类:基于...
整合了web日志聚合、分发、实时分析、入侵检测、数据存储与可视化的日志分析解决方案。聚合采用Apache Flume,分发采用Apache Kafka,实时处理采用Spark Streaming,入侵检测采用Spark MLlib,数据存储使用HDFS与...
入侵检测系统是近年出现的新型网络安全技术,目的是提供实时的入侵检测及采取 相应 的防护手段,如记录证据用于跟踪和恢复、断开网络连接等。 实时入侵检测能力之所以重要首先它能够对付来自内部网络的攻击,其次它...
3) 来自外部及内部网的病毒的破坏,来自Internet的Web浏览可能存在的恶意Java/Act iveX控件。病毒发作情况难以得到监控,存在大范围系统瘫痪风险。 4) 缺乏有效的手段监视、评估网络系统和操作系统的安全性。目前...