• 注册
  • 关于作者
    企业认证:趣记站长
    关注 6 粉丝 4 喜欢 9 内容 992
    江西省·南昌市
    聊天 送礼
    • 查看作者
    • 在Java Web中的入侵检测及质朴完成

        在Java Web运用程中,特别是网站开荒中,我们有时候需要为运用递次增加一个入侵检测递次来预防恶意刷新的遵守,预防造孽用户赓续的往Web运用中重复发送数据。

        一、简介

        在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运用中,由于统统运用都有一个入口,因此可以或许或许把入侵检测的递次直接插进去框架入口引擎中,

      VFP中的加密算法
      VFP编辑框中实现自动更正的方法,Visual FoxPro 9.0更强大了,如何用VFP的dbf进行SQL Server 7.0 的分布式查询,VFP智能感应的二次开发,谈两种数据库内容HTML格式的输出方法,用FoxWeb在网上快速发布你的FOXPRO数据库,在VFP5.0中实现中英文自动切换,在VFP中实现跟变式组合框及椭圆图形菜单,通过编程运行拨号网络连接,VFP中实现在浏览器中运行应用程序方法,为Visual FoxPro应用程序增加文件压缩功能,在VFP中模拟动画,用Visual FoxPro 5.0 设计数据文件结构浏览器,VFP表跟踪实现方法,让VFP程序在浏览器中运行,怎样在Visual FoxPro 中增加与去除网络联接,谈谈VFP和SQL SERVER搭配做C/S系统,卡拉OK字幕着色动态显示,利用Foxpro在网络环境下开发数据库管理软件经验点滴,用Foxpro制作Windows输入法码表
      Visual Foxpro

      VFP中的加密算法
      VFP编辑框中完成自动纠正的方法,Visual FoxPro 9.0更强大了,如何用VFP的dbf举办SQL Server 7.0 的分布式查询,VFP智能觉得的二次拓荒,谈两种数据库内容HTML名堂的输出方法,用FoxWeb在网上快速宣告你的FOXPRO数据库,在VFP5.0中完成中英文自动切换,在VFP中完成跟变式组合框及椭圆图形菜单,经过历程编程运转拨号网络连接,VFP中完成在浏览器中运转运用递次方法,为Visual FoxPro运用递次增加文件压缩服从,在VFP中模拟动画,用Visual FoxPro 5.0 想象数据文件组织浏览器,VFP表跟踪完成方法,让VFP递次在浏览器中运转,如何在Visual FoxPro 中增加与去除网络连接,谈谈VFP和SQL SERVER搭配做C/S系统,卡拉OK字幕着色动态展现,运用Foxpro在网络情况下拓荒数据库管理软件经验点滴,用Foxpro制作Windows输入法码表
      Visual Foxpro

      使框架本身支持入侵检测遵守。当然,也可以或许或许经过历程完成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;

        }

       

              五、总结

        当然,这里供给的方法只是一个质朴的完成示例,由于上面的用户信息是直接生计在内存中,若并发用户很大的时候的代码的占用,可以或许或许揣摩引入数据库来记载用户的访问信息,当然相应的执行效能肯定用下落。上面引见的完成中,入侵检测揣摸的计谋也只需用户访问次数及时候间隔两个元素,您还可以或许或许根据你的完成状态增加其他的检测元素。

      如何做改变的光盘动画
      用VB竖立FTP组件(get),Visual Basic构建线程安然的Singleton,如何完成VB与EXCEL的无缝连接,vb中运用xmlhttp来下载远程文件,vb中运用正则表达式,ASP.NET中Cookie编程的基础知识,MASM-打字练习递次,用VB制作注册软件的方法,VB递次中数据库的图片措置责罚的处理方法,用VB编写键盘阻止递次,用VB完成客户——服务器(TCP/IP)编程实例,运用Visual Basic 完成无线通讯,VB 中资源文件的多种运用妙技,VB中资源文件的细致运用方法,vb吸取GPS数据源码全,VB6中运用Winsock穿越各种代理的完成(TCP协议),VB完成文字“闪入”展现的特殊效果,VB对注册表操纵递次开机时运转,VB将OCX植入执行文件内,运用VB函数Dir()完成递归搜索目录
      Visual Basic

      VFP中的加密算法
      VFP编辑框中实现自动更正的方法,Visual FoxPro 9.0更强大了,如何用VFP的dbf进行SQL Server 7.0 的分布式查询,VFP智能感应的二次开发,谈两种数据库内容HTML格式的输出方法,用FoxWeb在网上快速发布你的FOXPRO数据库,在VFP5.0中实现中英文自动切换,在VFP中实现跟变式组合框及椭圆图形菜单,通过编程运行拨号网络连接,VFP中实现在浏览器中运行应用程序方法,为Visual FoxPro应用程序增加文件压缩功能,在VFP中模拟动画,用Visual FoxPro 5.0 设计数据文件结构浏览器,VFP表跟踪实现方法,让VFP程序在浏览器中运行,怎样在Visual FoxPro 中增加与去除网络联接,谈谈VFP和SQL SERVER搭配做C/S系统,卡拉OK字幕着色动态显示,利用Foxpro在网络环境下开发数据库管理软件经验点滴,用Foxpro制作Windows输入法码表
      Visual Foxpro

    • 0
    • 0
    • 0
    • 75
    • 单栏布局 侧栏位置: