`

Java Web中的入侵检测及简单实现

 
阅读更多
<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog01.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>

      作者:EasyJF开源团队 大峡

一、简介

  在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:记录用户登录信息,判断用户登录情况


*

Copyright: Copyright (c) 2006


*

Company: www.easyjf.com

>
* @author 蔡世友
* @version 1.0
*/
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次为超时


*

Copyright: Copyright (c) 2006


*

Company: www.easyjf.com

>
* @author 蔡世友
* @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{
int num=maxOnlineUser/2;
it=users.keySet().iterator();
while(it.hasNext() && i<num></num>{
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())<maxfailureinterval></maxfailureinterval>{
ret=false;
auth.setStatus(-1);
}
else if(auth.getStatus()==-1 && (now.getTime()-auth.getFirstFailureTime().getTime(){
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;
}

  
    
五、总结
  当然,这里提供的方法只是一个简单的实现示例,由于上面的用户信息是直接保存在内存中,若并发用户很大的时候的代码的占用,可以考虑引入数据库来记录用户的访问信息,当然相应的执行效率肯定用降低。上面介绍的实现中,入侵检测判断的策略也只有用户访问次数及时间间隔两个元素,您还可以根据你的实现情况增加其它的检测元素。

  由于水平有限,该设计上有N不合理或者需要改进的地方,恳请大家指正!



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=657199


分享到:
评论

相关推荐

    在Java Web中的入侵检测及简单实现

    在Java Web中的入侵检测及简单实现 java代码

    基于监督学习的web入侵检测系统源码.zip

    【毕业设计】基于监督学习的web入侵检测系统源码【毕业设计】基于监督学习的web入侵检测系统源码【毕业设计】基于监督学习的web入侵检测系统源码【毕业设计】基于监督学习的web入侵检测系统源码【毕业设计】基于监督...

    web版基于Java的海康摄像头SDK车牌抓拍功能二次开发(springboot+maven)

    本项目是一个用springboot+maven对海康sdk抓拍功能进行了二次开发,里面包含我自己的springboot项目、海康最新cs版sdk、最新web版sdk、项目的说明文档,可以实现摄像头的抓拍、预览、录像、对讲功能,亲测有效

    毕业设计——基于监督学习的web入侵检测系统(0day收集器).zip

    毕业设计——基于监督学习的web入侵检测系统(0day收集器) ##机器学习方面 用的技术比较low,只是scikit-learn里面的svm用了一下,开始的时候用knn来着,当现在样本数量过万的时候发现knn的确吃力。 ##数据方面 ...

    harbinger:一个基于Spring MVCSecurity的Web应用程序入侵检测和防御框架

    一个基于Spring / 的Web应用程序入侵检测和防御框架。 甚至像恐惧事件的先兆一样,当先驱们仍在命运之前,在预兆即将到来之际,让天地一起向我们的气候和同胞展示。 -莎士比亚的哈姆雷特 Harbinger检测到您的Web...

    基于Flume&spark&Flask的分布式实时日志分析与入侵检测系统.zip

    通过学习Spring Boot,我了解了现代化的Java Web开发方式,并通过实践构建了一些简单的Web应用程序。我还意识到在学习过程中遇到的困难和挑战是正常的,通过不断的努力和学习,我能够克服这些困难并取得进步。 在...

    ApplicationIntrusionDetection:应用入侵检测项目

    公爵遭遇Duke Encounters是一个完整的 Web 应用程序,它利用基于应用程序入侵检测。 这个 Web 应用程序使用带有内存数据库和 UI 的 。 请记住,所有输入的信息只是暂时存储,重新启动时会丢失。 使用mvn spring-boot...

    Python基于人脸识别的酒店客房入侵检测系统(django)_(项目源码+数据库脚本+文档+LW+PPT)

    通过深入研究系统的设计思路、架构和实现细节,您将能够全面了解使用Python构建Web应用程序的方法。源代码不仅是学习的资源, 还可作为技术分享和交流的平台,促进技术互动和知识共享。 在学习过程中,您将通过分析...

    Web安全培训ppt(适合初学者)

    Web安全学习大纲 一、Web安全系列之基础 1、Web安全基础概念(1天) 互联网本来是安全的,自从有了研究安全的人之后,互联网就变的不安全了。 2、web面临的主要安全问题(2天) 客户端:移动APP漏洞、浏览器...

    这是一个基于php的入侵检测与防御系统.zip

    软件开发设计:PHP、QT、应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、...

    Web安全深度剖析(张柄帅)

    《Web安全深度剖析》总结了当前流行的高危漏洞的形成原因、攻击手段及解决方案,并通过大量的示例代码复现漏洞原型,制作模拟环境,更好地帮助读者深入了解Web应用程序中存在的漏洞,防患于未然。 《Web安全深度剖析...

    构建安全 Web 站点(PDG)

    讲述WEB安全需求,WEB服务器的安全策略,分布式拒绝服务攻击的原理、工具和对策,CGI的的安全管理,Cookies及其安全,Java的安全性,加密技术在安全管理中的应用,WEB浏览器的安全,Apache服务器的安全性,IIS服务器...

    网络安全保障措施.docx

    实时的入侵检测及采取相应的防护手段,如记录证据用于跟踪和恢复、断开网络连接等。实时入侵检测能力之所以重要首先它能够对付来自内部网络的攻击,其次它能够缩短hacker入侵的时间。入侵检测系统可分为两类:基于...

    防伪溯源系统java源码下载-puff_guards:粉扑的大创造

    ​ 整合了web日志聚合、分发、实时分析、入侵检测、数据存储与可视化的日志分析解决方案。聚合采用Apache Flume,分发采用Apache Kafka,实时处理采用Spark Streaming,入侵检测采用Spark MLlib,数据存储使用HDFS与...

    网络安全的关键技术有哪些.doc

    入侵检测系统是近年出现的新型网络安全技术,目的是提供实时的入侵检测及采取 相应 的防护手段,如记录证据用于跟踪和恢复、断开网络连接等。 实时入侵检测能力之所以重要首先它能够对付来自内部网络的攻击,其次它...

    电信网络安全解决方案.doc

    3) 来自外部及内部网的病毒的破坏,来自Internet的Web浏览可能存在的恶意Java/Act iveX控件。病毒发作情况难以得到监控,存在大范围系统瘫痪风险。 4) 缺乏有效的手段监视、评估网络系统和操作系统的安全性。目前...

Global site tag (gtag.js) - Google Analytics