`

Filter非法字符过滤器

阅读更多
package com.my.web.filter;

import java.io.IOException;
import java.util.Enumeration;
import java.util.Iterator;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

/**
 * 防sql注入过滤器,使用时需要注意可能会过滤掉正常访问
 * @version 1.0
 */
public class SqlFilter implements Filter {
	public static final Logger logger = Logger.getLogger(sun.reflect.Reflection.getCallerClass(1));
	
	//需要过滤的post参数值字符(不需要空格 可能会对系统访问有影响,请注意删减关键字)
	private static String postStr="%20,script";
	//需要过滤的post字符(可能会对系统访问有影响,请注意删减关键字)
	//private static String sqlStr="<,>,and,exec,insert,select,%20,delete,update,count,*,%,chr,mid,master,truncate,char,like,declare,&,#,(,),/**/,=,script,\u0023,redirect:,xwork2";
	// --and , count
	private static String sqlStr="exec,insert,select,%20,delete,update,chr,master,truncate,char,like,declare,#,/**/,script,\u0023,redirect:,xwork2";
	//需要过滤的url字符(可能会对系统访问有影响,请注意删减关键字)
	private static String urlStr="%20,%22,%27,<,>,master,truncate,char,script,java.lang.ProcessBuilder,java.lang.String,/etc/,\u0023,redirect:,xwork2,\u0073\u0063\u0072\u0069\u0070\u0074";
	public void destroy() {
   }

	public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
		request.setCharacterEncoding("utf-8");
		HttpServletRequest req = (HttpServletRequest)request;
		HttpServletResponse res = (HttpServletResponse)response;	

		Enumeration names = req.getParameterNames();//获取所有的表单参数
		String gotoUrl=req.getRequestURI();  //获取访问的url
		String queryString = req.getQueryString();
		
		//判断所有的参数名是否有非法字符
		while(names.hasMoreElements()){			
		String st=names.nextElement().toString();
			   if(strInj(st,sqlStr)||strInj2(st,urlStr)){
				   req.getSession().setAttribute("msgStr", "请不要输入非法参数:"+req.getParameter(st)+" !");
				   res.sendRedirect(req.getContextPath()+"/jsp/common/error.jsp");
			       return;
			   }
   
		} 
		
		//判断所有的参数值是否有非法字符
		Iterator values = req.getParameterMap().values().iterator();//获取所有的表单参数
		while(values.hasNext()){
		   String[] value = (String[])values.next();
		   for(int i = 0;i < value.length;i++){
			   if(strInj(value[i],sqlStr)||strInj2(value[i],postStr)){
				   request.setAttribute("msgStr", "请不要输入非法参数:"+value[i]+" !");
				   res.sendRedirect(req.getContextPath()+"/jsp/common/error.jsp");
			       return;
			   }

		   }
		} 
		
		//判断访问的url中是否有非法参数
		if(queryString!=null&&strInj2(queryString,urlStr)){
                req.getSession().setAttribute("msgStr", "请不要输入非法参数 !");
				res.sendRedirect(req.getContextPath()+"/jsp/common/error.jsp");
				return;
		}
	
		
		chain.doFilter(request, response);
	}
	
	/**
	 * 判断字符是否包含非法字符
	 * @param str
	 * @return
	 */
	public static boolean strInj(String str,String standStr){
		if(str==null||str.length()==0)return false;
		String[] inj_stra=standStr.split(",");
		for (int i=0 ; i < inj_stra.length ; i++ ){
			if (inj_stra[i].length()>0&&str.toLowerCase().indexOf(inj_stra[i])>=0){	
				System.out.println(inj_stra[i]);
			   return true;	
			}
		}	
		return false;
	}
	
	/**
	 * 判断字符是否包含非法字符,没有空格
	 * @param str
	 * @return
	 */
	public boolean strInj2(String str,String standStr){
		if(str==null||str.length()==0)return false;
		String[] inj_stra=standStr.split(",");
		for (int i=0 ; i < inj_stra.length ; i++ ){
			if (inj_stra[i].length()>0&&str.toLowerCase().indexOf(inj_stra[i])>=0){	
			   return true;	
			}
		}	
		return false;
	}


	public void init(FilterConfig cfg) throws ServletException {
		
	}
	
	public static void main(String[] args){
		SqlFilter2 sf = new SqlFilter2();
		String st = "standardPrice";
		if(strInj(st,sqlStr)){
			System.out.println("=======:"+sqlStr.indexOf(st));
		   }
		if(sf.strInj2(st,urlStr)){
			System.out.println("=======:"+urlStr.indexOf(st));
		}
	}
}

 

web.xml配置

	<filter>
		<filter-name>SqlFilter</filter-name>
		<filter-class>com.my.web.filter.SqlFilter</filter-class>
	</filter>	
	
	<filter-mapping>
		<filter-name>SqlFilter</filter-name>
		<url-pattern>*.action</url-pattern>
	</filter-mapping>

 

分享到:
评论

相关推荐

    监听器访问计数过滤非法字符

    用监听器实现在线人数统计,过滤器实现页面自动编码 非法字符过滤

    过滤器过滤用户输入的非法字符

    过滤器过滤用户输入的非法字符,如“” “%” “+”等需要的两个类XssFilter.java和XssHttpServletRequestWrapper.java

    过滤器 乱码,非法字符,权限

    此资源系本人在培训机构的资料,资源包含过滤器乱码过滤、过滤非法字符、权限过滤、病毒过滤、HTML标签过滤、js脚本过滤等代码演示实例和讲解文档,内容详细易懂,希望对象大家有所帮助!

    六个有用的java过滤器

    六个有用的java过滤器,包括使浏览器不缓存页面的过滤器、检测用户是否登陆的过滤器、字符编码的过滤器、资源保护过滤器、利用Filter限制用户浏览权限、利用Filter过滤非法关键字。

    预防XSS攻击和SQL注入XssFilter

    三、过滤器配置 web.xml配置 &lt;filter&gt; &lt;filter-name&gt;XssFilter&lt;/filter-name&gt; &lt;filter-class&gt;com.xxx.Filter.XssFilter&lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;XssFilter&lt;/filter-name&gt; ...

    浅析JAVA中过滤器、监听器、拦截器的区别

    1.过滤器:所谓过滤器顾名思义是用来过滤的,在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的action进行业务逻辑,比如过滤掉非法url(不是login....

    FilterAndInterceptor

    比如过滤掉非法url或者在传入servlet/struts的action前统一设置字符集,或者去除掉一些非法字符等; 拦截器--它由spring管理,只对action起作用,不能拦截jsp页面、图片等其他资源。执行顺序:过滤前 - 拦截前 - ...

    &nbsp;基于布隆过滤器的字符串模糊匹配算法的FPGA实现

    针对该问题,提出了采用Bloom Filter(布隆过滤器)进行字符串模糊匹配方式,利用Bloom Filter将信息流中大部分正常流量过滤掉,从而减轻了后端的字符串精确匹配的压力,降低了系统功耗,大大提高了处理速度。

    java sql注入l

    44 throw new IOException("您发送请求中的参数中含有非法字符"); 45 //String ip = req.getRemoteAddr(); 46 } else { 47 chain.doFilter(args0,args1); 48 } 49 } 50 51 //效验 52 protected ...

    代码生成器-可自定义模版-guns

    7. 防止XSS攻击,通过XssFilter类对所有的输入的非法字符串进行过滤以及替换。 8. 简单可用的代码生成体系,通过SimpleTemplateEngine可生成带有主页跳转和增删改查的通用控制器、html页面以及相关的js,还可以生成...

    Guns后台管理系统-其他

    6、防止XSS攻击,通过XssFilter类对所有的输入的非法字符串进行过滤以及替换。 7、简单可用的代码生成体系,通过SimpleTemplateEngine可生成带有主页跳转和增删改查的通用控制器、html页面以及相关的js,还可以生成...

Global site tag (gtag.js) - Google Analytics