亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

關于在Java Web中的入侵檢測及簡單實現

2019-11-17 04:34:21
字體:
來源:轉載
供稿:網友

一、簡介

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<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;

}

五、總結

當然,這里提供的方法只是一個簡單的實現示例,由于上面的用戶信息是直接保存在內存中,若并發用戶很大的時候的代碼的占用,可以考慮引入數據庫來記錄用戶的訪問信息,當然相應的執行效率肯定用降低。上面介紹的實現中,入侵檢測判斷的策略也只有用戶訪問次數及時間間隔兩個元素,您還可以根據你的實現情況增加其它的檢測元素。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩最新av在线| 一区二区三区在线播放欧美| 亚洲欧美日韩精品久久| 亚洲最新视频在线| 久久久久久久久国产精品| 日韩高清欧美高清| 亚洲精品国产suv| 欧美日韩精品在线播放| 热草久综合在线| 2020欧美日韩在线视频| 亚洲成人网av| 精品国产91乱高清在线观看| 亚洲国产成人久久综合一区| 精品国产精品自拍| 91免费版网站入口| 日韩免费av在线| 国产97人人超碰caoprom| 国产aⅴ夜夜欢一区二区三区| 91亚洲国产成人精品性色| 91av视频在线免费观看| 久久不射热爱视频精品| 欧美午夜片在线免费观看| 欧美电影在线观看网站| 久久综合久中文字幕青草| 国产精品久久久久影院日本| 国产成人激情小视频| 国产一区二区三区视频| 亚洲精品福利资源站| 亚洲曰本av电影| 国产成人精品视频在线| 欧美高清理论片| 亚洲成人激情图| 午夜剧场成人观在线视频免费观看| 国产一区二区三区视频在线观看| 久久综合免费视频影院| 日韩在线免费av| 国产日韩av高清| 91丝袜美腿美女视频网站| 欧美日韩高清在线观看| 日韩在线免费视频观看| 久久久在线观看| 亚洲伊人久久大香线蕉av| 亚洲国产成人精品女人久久久| 国产精品美女久久久免费| 国产一区二区香蕉| 久久久成人精品| 欧美另类老肥妇| 欧美精品在线网站| 国内揄拍国内精品| 欧美国产日韩一区二区三区| 日韩成人在线视频网站| 91黑丝高跟在线| 一区二区三区无码高清视频| 性欧美在线看片a免费观看| 成人在线视频网| 九九热在线精品视频| 懂色av影视一区二区三区| 欧美另类暴力丝袜| 国产亚洲精品日韩| 黑人极品videos精品欧美裸| 日韩高清电影免费观看完整版| 大荫蒂欧美视频另类xxxx| 久久精品2019中文字幕| 欧美视频一区二区三区…| 秋霞av国产精品一区| 欧美性猛交xxxx偷拍洗澡| 国产精品mp4| 国产成人在线精品| 欧美国产日韩精品| 久久91精品国产91久久久| 亚洲淫片在线视频| 日本韩国欧美精品大片卡二| 黄色一区二区在线观看| 26uuu久久噜噜噜噜| 久久免费福利视频| 亚洲奶大毛多的老太婆| 亚洲色图第一页| 久久久亚洲国产| 国产日韩在线播放| 91九色单男在线观看| 97国产一区二区精品久久呦| 色噜噜久久综合伊人一本| 日韩成人在线免费观看| 亚洲成在人线av| 黄色一区二区在线| 自拍偷拍亚洲精品| 国产福利成人在线| 97色在线播放视频| 97av在线视频免费播放| 欧美性videos高清精品| 国产午夜精品美女视频明星a级| 精品久久久av| 亚洲2020天天堂在线观看| 国产中文字幕日韩| 少妇高潮久久久久久潘金莲| 97久久精品国产| 成人a级免费视频| 欧美日韩国产精品专区| 久久精品成人一区二区三区| 日韩禁在线播放| 亚洲欧美中文字幕| 91亚洲精品在线| 亚洲福利视频免费观看| 欧美多人乱p欧美4p久久| 国产精品久久久久久久天堂| 国产亚洲精品久久久久久牛牛| 91精品久久久久久久久不口人| 精品电影在线观看| 国产精品pans私拍| 久久久久久久一| 97婷婷大伊香蕉精品视频| 国产精品久久久久久婷婷天堂| 5566成人精品视频免费| 国产日韩在线亚洲字幕中文| 一区国产精品视频| 亚洲热线99精品视频| 91中文精品字幕在线视频| 国产精品视频精品视频| 欧美精品18videos性欧| 一二美女精品欧洲| 国产精品大片wwwwww| 日本成人在线视频网址| 97色伦亚洲国产| 亚洲国产中文字幕在线观看| 97精品国产aⅴ7777| 91精品国产综合久久香蕉的用户体验| 久久国产精品亚洲| 欧美日韩亚洲国产一区| 亚洲国产三级网| 青青a在线精品免费观看| 亚洲男人的天堂在线播放| 91高清在线免费观看| 日韩大片免费观看视频播放| 欧美中文字幕在线| 日韩欧亚中文在线| 日本亚洲欧美三级| 日韩欧美视频一区二区三区| 成人免费观看49www在线观看| 538国产精品一区二区在线| 5278欧美一区二区三区| 日韩av123| 亚洲男人的天堂在线| 久久视频国产精品免费视频在线| 色狠狠av一区二区三区香蕉蜜桃| 国产精品极品美女在线观看免费| 欧美精品在线看| 日韩亚洲国产中文字幕| 欧美国产日韩二区| 亚洲激情视频网站| 欧美午夜美女看片| 亚洲最大成人在线| 欧美激情va永久在线播放| 欧美视频在线观看 亚洲欧| 欧美国产日本高清在线| 久久久久久高潮国产精品视| 亚洲精品狠狠操| 美女扒开尿口让男人操亚洲视频网站| 久久国产精品免费视频| 国产99久久精品一区二区| 午夜精品蜜臀一区二区三区免费| 欧美亚洲日本黄色| 最近的2019中文字幕免费一页| 国产不卡精品视男人的天堂| 色综合久久久久久中文网|