一、簡介
在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; } }
|