码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2015-07-02 23:55:14      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

最近给学校做了一个最美系部投票网站,不少人想通过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

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

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!