java 过滤器filter防sql注入的实现代码

 更新时间:2016年08月25日 09:23:45   投稿:jingxian  
下面小编就为大家带来一篇java 过滤器filter防sql注入的实现代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

实例如下:

XSSFilter.java

public void doFilter(ServletRequest servletrequest,
			ServletResponse servletresponse, FilterChain filterchain)
			throws IOException, ServletException {
		

		//flag = true 只做URL验证; flag = false 做所有字段的验证;
		boolean flag = true;
		if(flag){
			//只对URL做xss校验
			HttpServletRequest httpServletRequest = (HttpServletRequest) servletrequest;
			HttpServletResponse httpServletResponse = (HttpServletResponse) servletresponse;
			
			String requesturi = httpServletRequest.getRequestURL().toString();
			requesturi = URLDecoder.decode(requesturi, "UTF-8");
			if(requesturi!=null&&requesturi.indexOf("alipay_hotel_book_return.html")!=-1){
				filterchain.doFilter(servletrequest, servletresponse);
				return;
			}
			if(requesturi!=null&&requesturi.indexOf("account_bank_return.html")!=-1){
				filterchain.doFilter(servletrequest, servletresponse);
				return;
			}
			if(requesturi!=null&&requesturi.indexOf("/alipay/activity.html")!=-1){
				filterchain.doFilter(servletrequest, servletresponse);
				return ;
			}
			if(requesturi!=null&&requesturi.indexOf("/alipayLogin.html")!=-1){
				filterchain.doFilter(servletrequest, servletresponse);
				return ;
			}
			RequestWrapper rw = new RequestWrapper(httpServletRequest);
			String param = httpServletRequest.getQueryString();
			if(!"".equals(param) && param != null) {
				param = URLDecoder.decode(param, "UTF-8");
				String originalurl = requesturi + param;
				
				String sqlParam = param;
				//添加sql注入的判断
				if(requesturi.endsWith("/askQuestion.html") || requesturi.endsWith("/member/answer.html")){
					sqlParam = rw.cleanSQLInject(param);
				}
				
				String xssParam = rw.cleanXSS(sqlParam);
				requesturi += "?"+xssParam;
				
				
				if(!xssParam.equals(param)){
					System.out.println("requesturi::::::"+requesturi);
					httpServletResponse.sendRedirect(requesturi);
					System.out.println("no entered.");
//					filterchain.doFilter(new RequestWrapper((HttpServletRequest) servletrequest), servletresponse);
					return ;
				}
			}
			filterchain.doFilter(servletrequest, servletresponse);
		}else{
			
			//对请求中的所有东西都做校验,包括表单。此功能校验比较严格容易屏蔽表单正常输入,使用此功能请注意。
			filterchain.doFilter(new RequestWrapper((HttpServletRequest) servletrequest), servletresponse);
		}
	}
requestMapping: 


public RequestWrapper(){
		super(null);
	}

	public RequestWrapper(HttpServletRequest httpservletrequest) {
		super(httpservletrequest);
	}

	public String[] getParameterValues(String s) {
		String str[] = super.getParameterValues(s);
		if (str == null) {
			return null;
		}
		int i = str.length;
		String as1[] = new String[i];
		for (int j = 0; j < i; j++) {
			as1[j] = cleanXSS(cleanSQLInject(str[j]));
		}

		return as1;
	}

	public String getParameter(String s) {
		String s1 = super.getParameter(s);
		if (s1 == null) {
			return null;
		} else {
			return cleanXSS(cleanSQLInject(s1));
		}
	}

	public String getHeader(String s) {
		String s1 = super.getHeader(s);
		if (s1 == null) {
			return null;
		} else {
			return cleanXSS(cleanSQLInject(s1));
		}
	}

	public String cleanXSS(String src) {
		String temp =src;

		System.out.println("xss---temp-->"+src);
    src = src.replaceAll("<", "<").replaceAll(">", ">");
    // if (src.indexOf("address")==-1)
	//	{
     src = src.replaceAll("\\(", "(").replaceAll("\\)", ")");
		//}
   
    src = src.replaceAll("'", "'");
    
    Pattern pattern=Pattern.compile("(eval\\((.*)\\)|script)",Pattern.CASE_INSENSITIVE);  
	  Matcher matcher=pattern.matcher(src);  
	  src = matcher.replaceAll("");

	  pattern=Pattern.compile("[\\\"\\'][\\s]*javascript:(.*)[\\\"\\']",Pattern.CASE_INSENSITIVE); 
	  matcher=pattern.matcher(src);
	  src = matcher.replaceAll("\"\"");
	  
	  //增加脚本 
	  src = src.replaceAll("script", "").replaceAll(";", "")
	  	.replaceAll("\"", "").replaceAll("@", "")
	  	.replaceAll("0x0d", "")
	  	.replaceAll("0x0a", "").replaceAll(",", "");

		if(!temp.equals(src)){
			System.out.println("输入信息存在xss攻击!");
			System.out.println("原始输入信息-->"+temp);
			System.out.println("处理后信息-->"+src);
		}
		return src;
	}
	
	//需要增加通配,过滤大小写组合
	public String cleanSQLInject(String src) {
		String temp =src;
    src = src.replaceAll("insert", "forbidI")
    	.replaceAll("select", "forbidS")
    	.replaceAll("update", "forbidU")
    	.replaceAll("delete", "forbidD")
    	.replaceAll("and", "forbidA")
    	.replaceAll("or", "forbidO");
    
		if(!temp.equals(src)){
			System.out.println("输入信息存在SQL攻击!");
			System.out.println("原始输入信息-->"+temp);
			System.out.println("处理后信息-->"+src);
		}
		return src;
	}

xml配置:

<filter>
		<filter-name>XssFilter</filter-name>
		<filter-class>cn.com.jsoft.xss.XSSFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>XssFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

以上代码仅仅将特殊的sql字符,特殊script脚本字符处理掉,具体的页面处理还需要后台处理!!

关于这篇java 过滤器filter防sql注入的实现代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java并发编程volatile关键字的作用

    Java并发编程volatile关键字的作用

    这篇文章主要介绍了Java并发编程volatile关键字的作用,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • java代码获取数据库表里数据的总数操作

    java代码获取数据库表里数据的总数操作

    这篇文章主要介绍了java代码获取数据库表里数据的总数操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Java实现ip地址和int数字的相互转换

    Java实现ip地址和int数字的相互转换

    这篇文章主要介绍了Java实现ip地址和int数字的相互转换,帮助大家更好的利用Java处理数据,感兴趣的朋友可以了解下
    2020-09-09
  • 使用Prometheus监控Tomcat等java应用的状态

    使用Prometheus监控Tomcat等java应用的状态

    本文介绍了如何配置Tomcat监控,使用JMX Exporter和Prometheus进行监控,并通过Grafana展示监控数据
    2024-12-12
  • JAVA构造函数不能使用void关键字问题

    JAVA构造函数不能使用void关键字问题

    这篇文章主要介绍了JAVA构造函数不能使用void关键字问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • springboot集成shiro自定义登陆过滤器方法

    springboot集成shiro自定义登陆过滤器方法

    这篇文章主要介绍了springboot集成shiro自定义登陆过滤器方法,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • Java多线程中的Executor详解

    Java多线程中的Executor详解

    这篇文章主要介绍了Java多线程中的Executor详解,该接口提供了一种将任务提交与如何运行每个任务的机制(包括线程使用、调度等细节)解耦的方法,它通常使用预先创建线程而不是创建线程,需要的朋友可以参考下
    2023-12-12
  • Springboot项目全局异常统一处理案例代码

    Springboot项目全局异常统一处理案例代码

    最近在做项目时需要对异常进行全局统一处理,主要是一些分类入库以及记录日志等,因为项目是基于Springboot的,所以去网络上找了一些博客文档,然后再结合项目本身的一些特殊需求做了些许改造,现在记录下来便于以后查看
    2023-01-01
  • springboot实现maven多模块和打包部署

    springboot实现maven多模块和打包部署

    本文主要介绍了springboot实现maven多模块和打包部署,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Spring Security自定义身份认证的实现方法

    Spring Security自定义身份认证的实现方法

    这篇文章主要介绍了Spring Security自定义身份认证的实现方法,下面对Spring Security的这三种自定义身份认证进行详细讲解,需要的朋友可以参考下
    2025-04-04

最新评论