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