防止黑客远程高频率请求网站解决方案

最近给学校做了一个最美系部投票网站,不少人想通过sql注入漏洞攻击网站,我也是被逼无赖好好的和这些人战斗了2天。

一开始他们应该使用了一些工具不断的去检测我的sql注入点,这是我第二次正式做这种大型的投票系统,本来我已近很注意了没有留下注入点。

只是在查询语句中是使用的 sql字符串拼凑,我想查询语句应该不能做什么吧。后来发现他们不断的对拼凑的地方进行攻击,于是我就好好的想了想

也在网站上找了许多资料,发现只要是有sql拼凑的地方就有可能注入漏洞。

-- 比如一个:
SELECT * FORM USER WHERE ID=PRAMS1;

--本来PRAMS1 是我们读取的id号但是如果参数被替换成:
 1  ; DROP USER --
-- 这样一来很可怕的事情就发生了,表被删除了!

所以千万不要在程序中留下拼凑的痕迹。 这些都是些定时炸弹!

即使这样做了,在程序中没有留下任何拼凑,但是他们的不断请求扫描依然导致了网站访问速度极慢。

所以我开始思考如何防止他们的高频率请求下面是过滤器代码,:基本思路是

1、定义一个临时的hashmap 记录访问者IP地址和上一次访问时间以及访问的次数

2、如果访问时间间隔低于150ms 则视为一次异常请求 当请求次数高于200次的时候就把这个ip地址存入 另一个集合hkList中。

3、每次经过过滤器先判断访问者ip是否存在 hkList中,然后决定是否让其继续访问

具体看代码吧!

特别值得注意的是:如果对方使用程序进行发送请求那么数据存在session中是没有意义的,因为程序发送的请求每次的session都是新的尽管他们来自同一个IP地址。具体是因为什么。。。。我也不清楚。

所以我的记录值是存放 ServletContext 中的。

public class AexInterceptor implements Interceptor {

    private static final long serialVersionUID = -5178310397732210602L;

    public void destroy() {
    }

    public void init() {
    }

    public String intercept(ActionInvocation invocation) throws Exception {

        ActionContext actionContext = invocation.getInvocationContext();
        HttpServletRequest request = (HttpServletRequest) actionContext.get(StrutsStatics.HTTP_REQUEST);
        HttpServletResponse response = (HttpServletResponse) actionContext.get(StrutsStatics.HTTP_RESPONSE);
            
        CU.deBugPrintln("进入拦截器"+request.getRequestURI()+"Session id="+request.getSession().getId());

         String ip= request.getRemoteAddr();

            ArrayList<String> hkList=(ArrayList<String>)request.getSession().getServletContext().getAttribute("hkList");

            if(hkList==null){
                CU.deBugPrintln("创建hkList");
                hkList=new ArrayList<String>();
                request.getSession().getServletContext().setAttribute("hkList", hkList);
            }

            //如果黑名单中存在这个ip地址则直接跳转
            if(hkList.contains(ip)){
                 CU.deBugPrintln("转发到提示页面-----------------------");
                response.sendRedirect("info.jsp");
                return null;
            }

          //记录数达到1000个后清空一次
        if(hkList.size()>1000){
            CU.deBugPrintln("清空黑客ip监控-----------------------");
            hkList.clear();
        }

        CU.deBugPrintln(hkList);

        @SuppressWarnings("unchecked")
        HashMap<String, String> tempIPList=(HashMap<String, String>) request.getSession().getServletContext().getAttribute("tempIPList");

        if(tempIPList==null){
            tempIPList=new HashMap<String, String>();
            request.getSession().getServletContext().setAttribute("tempIPList", tempIPList);
        }

        CU.deBugPrintln("当前ip记录数===="+tempIPList.size());

        //记录数达到 2000个后清空一次
        if(tempIPList.size()>2000){
            CU.deBugPrintln("清空ip监控-----------------------");
            tempIPList.clear();
        }

        Long nowTime=new Date().getTime();
        String valueStr=tempIPList.get(ip);

        if(valueStr==null){
            tempIPList.put(ip, nowTime+","+1);
            //正常访问
            CU.deBugPrintln("第一次访问-----------"+ip);
        }else{

        Long prevTime = Long.parseLong(valueStr.substring(0, tempIPList.get(ip).indexOf(",")));

        int count=Integer.parseInt(valueStr.substring(valueStr.indexOf(",")+1));

            CU.deBugPrintln(nowTime);
            CU.deBugPrintln(prevTime);

           //上下文中存在改ip地址
            if(nowTime-prevTime<150 && count>200){
              //如果相差不到150毫秒并且请求次数达到就是黑客
             //覆盖原来的重新计算时间
             tempIPList.put(ip,  nowTime+","+(count+1));
             //加入黑名单

             CU.deBugPrintln(" 黑客攻击请求-----------"+ip);
             hkList.add(ip);
             CU.deBugPrintln(" 黑客攻击请求-----------"+ip);

            }else{
                tempIPList.put(ip, nowTime+","+(count+1));
                //正常访问
                CU.deBugPrintln("正常访问-----------"+ip);
            }
    }
        return invocation.invoke();

    }

}

最后附上本次项目的页面吧!替我们学校打打广告。湖南人文科技学院欢迎您哦!

原文地址:http://www.cnblogs.com/jyyjava/p/4617309.html

时间: 2024-12-24 02:16:44

防止黑客远程高频率请求网站解决方案的相关文章

高并发量网站解决方案

一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构.性能的要求都很简单.随着互联网业务的不断丰富,网站相关的技术经过这些年的发展,已经细分到很细的方方面面,尤其对于大型网站来说,所采用的技术更是涉及面非常广,从硬件到软件.编程语言.数据库.WebServer.防火墙等各个领域都有了很高的要求,已经不是原来简单的html静态网站所能比拟的. 大型网站,比如门户网站,在面对大量用户访问.高并发请求方面,基本的解决方案

Web网站高并发量的解决方案

摘要: ??一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构.性能的要求都很简单.随着互联网业务的不断丰富,网站相关的技术经过这些年的发展,已经细分到很细的方方面面,尤其对于大型网站来说,所采用的技术更是涉及面非常广,从硬件到软件.编程语言.数据库.WebServer.防火墙等各个领域都有了很高的要求,已经不是原来简单的html静态网站所能比拟的.??大型网站,比如门户网站,在面对大量用户访问.高并发请求方面,

大流量高并发量网站的之解决方案

一.对于网站访问速度影响的条件如下: 瓶颈主要有: 1.磁盘搜索 优化方法是:将数据分布在多个磁盘上 2.磁盘读/写 优化方法是:从多个磁盘并行读写. 3.CPU周期 优化方法:扩充内存 4.内存带宽 二.大流量高并发量网站的解决方案 1.确认服务器硬件是否足够支持当前的流量. 2.使用memcache缓存技术,将动态数据缓存到内存中,动态网页直接调用这些文件,而不必在访问数据库. 3.禁止外部的盗链. 4.外部网站的图片或者文件盗链往往会带来大量的负载压力,因此应该严格限制外部对自身图片或者文

java处理高并发高负载类网站的优化方法

一:高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF.尤其是Web2.0的应用,数据库的响应是首先要解决的. 一般来说MySQL是最常用的,可能最初是一个mysql主机,当数据增加到100万以上,那么,MySQL的效能急剧下降.常用的优化措施是M-S(主-从)方式进行同步复制,将查询和操作和分别在不同的服务器上进行操作.我推荐的是M-M-Slaves方式,2个主Mysql,多个Slaves,需要注意的是,虽然有2个Master,但是同时只有1个是Activ

高并发高流量的网站架构设计 (转)

Web2.0的兴起,掀起了互联网新一轮的网络创业大潮.以用户为导向的新网站建设概念,细分了网站功能和用户群,不仅成功的造就了一大批新生的网站,也极大的方便了上网的人们.但Web2.0以用户为导向的理念,使得新生的网站有了新的特点——高并发,高流量,数据量大,逻辑复杂等,对网站建设也提出了新的要求. 本文围绕高并发高流量的网站架构设计问题,主要研究讨论了以下内容: 首先在整个网络的高度讨论了使用镜像网站,CDN内容分发网络等技术对负载均衡带来的便利及各自的优缺点比较.然后在局域网层次对第四层交换技

构建高扩展性网站

如何构建高扩展性网站?     阅读目录 主要内容 化简方程 分布工作 横向扩展设计 使用正确的工具 不要做重复的工作 积极利用缓存 从错误中吸取教训 数据库原则 容错设计与故障控制 避免或分发状态 异步通信和消息总线 其他原则 参考 本篇通过阅读<高扩展性网站的50条原则>,总结出以下内容. 一方面博主没有实际的架构经验,另一方面知识面也不够宽阔,所以只能系统的总结书中的要点,并根据自己的理解做些归纳. 主要内容 本书从多个方面围绕高扩展性提出了50条建议,一个高扩展性的网站会随着业务的发展

妥善的ajax跨域提交post请求的解决方案,结合PHP与jquery

开发背景: 在开发中采用了一个新的架构,将大部分客户的留言功能集成到一个公共API提交保存,采用不同的用户名区分,供客户查询自己网站的留言,这样节约了客户网站的资源,也提升了维护性. 那么在提交时不能采用直接的post提交,否则会产生跳转,使访客混乱,所以采用ajax提交留言内容至公共服务器:http://wx.igooda.cn/index.php/messagesave,但尝试后发现不能提交post请求,百度后查询结果是跨域只能是get请求,这对留言内容多的来说,是不可行的.还有一种解决方案

高并发的成熟解决方案

课程来自传智播客 上官云老师 课程名称:企业高并发的成熟解决方案 案例来自:阿里巴巴研究院 分析企业架构 负载均衡服务器: 1.转发请求 2.还有... 负载均衡服务器种类: 反向代理服务器 并发分为两个地方: 1.负载均衡服务器高并发 2.数据库高并发 第一步解决负载均衡服务器 出现在此处的问题: 如果用户登录了,session是如何共享的? 用户请求1号机的时候产生了session 用户在请求2号机的时候就没有session了 产生的结果就是:用户被剔除登录后页面 解决方案: 1.把用户的s

高扩展性网站的50条原则

<高扩展性网站的50条原则>,利用一天半的时间快速浏览总结的电子书,对网站的建设有一个原则性的把握,书中提到的大部分原则现在已成为互联网行业的共识,但并不妨碍我们重新整理分类,从全局层面把控高扩展性网站的建设思路,文中的每一条尽管高度凝练,但都值得细细品味.完成于2015年6月11日11:02:19. (一)化简方程 不要过度设计:基于成本的考虑,只设计能满足要求的系统即可,过于理想化的设计不利于系统的维护与成本控制: 设计时考虑扩展性:设计20倍的容量,实现3倍的容量,部署1.5倍的容量,即