全国统一服务热线:400-633-9193

为JavaWeb应用程序增加入侵检测功能

admin     网络     2017-03-15    1587

一、简介
  在Java www.100ksw.come;
  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.www.100ksw.complements Runnable{
  private Thread parentThread;
  public CheckTimeOut(Thread parentThread)
  {
  this.parentThread=parentThread;
  synchronized(this){
  if(checkThread==null){ 
  checkThread= newww.100ksw.come)//只检查认证失败次数
  {
  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+":"+(nowww.100ksw.comanage.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的核心 Servletcom.easyjf.web.ActionServlet 中调用UserConnectManage的代码:
  if(!UserConnectManage.checkLoginValidate(request.getRemoteAddr(),"guest"))
  { 
  info(request,response,new Exception("您对页面的刷新太快,请等待"+UserConnectManage.getWaitInterval()/1000+"秒后再刷新页面!"));
  return;
  }
  五、总结
  当然,这里提供的方法只是一个简单的实现示例,由于上面的用户信息是直接保存在内存中,若并发用户很大的时候的代码的占用,可以考虑引入数据库来记录用户的访问信息,当然相应的执行效率肯定用降低。上面介绍的实现中,入侵检测判断的策略也只有用户访问次数及时间间隔两个元素,您还可以根据你的实现情况增加其它的检测元素。

  分享到:  
0.2718s