利用拦截器实现sql防止注入

本文探讨了如何利用拦截器防止SQL注入,并解决了在Filter中注入Service时遇到的空指针异常问题。通过分析Filter的工作原理,提出了三种避免循环重定向的方法,并详细解释了获取ServletContext的途径。同时,文章建议使用Spring MVC的HandlerInterceptor来替代Filter,以更高效地管理拦截逻辑。
摘要由CSDN通过智能技术生成

web.xml的代码:

<!-- 防止sql注入的拦截器-->
    <filter>
        <filter-name>sqlInjectionFilter</filter-name>
        <filter-class>com.suning.mcms.web.auth.filter.SqlInjectionFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>sqlInjectionFilter</filter-name>
        <url-pattern>*.do</url-pattern>
    </filter-mapping>
拦截器的代码:

package com.suning.mcms.web.auth.filter;

import java.io.IOException;
import java.util.Enumeration;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.context.support.XmlWebApplicationContext;

import com.suning.mcms.web.auth.util.RedirectUtils;
import com.suning.zbl.SqlInjectionEntity;
import com.suning.zbl.injection.service.SqlInjectionService;

public class SqlInjectionFilter implements Filter{

	@Autowired
	private SqlInjectionService sqlInjectionService;

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {

	}

	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
			FilterChain filterChain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) servletRequest;  
		HttpServletResponse response = (HttpServletResponse) servletResponse;
		HttpSession session = request.getSession(false);



		HttpServletRequest req = (HttpServletRequest)request;
		HttpServletResponse resp = (HttpServletResponse)response;
		ServletContext sc = req.getSession().getServletContext();
		XmlWebApplicationContext cxt = (XmlWebApplicationContext)WebApplicationContextUtils.getWebApplicationContext(sc);

		if(cxt != null && cxt.getBean("sqlInjectionService") != null && sqlInjectionService == null)
			sqlInjectionService = (SqlInjectionService) cxt.getBean("sqlInjectionService");

		SqlInjectionEntity sqlInjectionEntity = new SqlInjectionEntity();
		sqlInjectionEntity.setKey("sqlInjection");
		SqlInjectionEntity result = sqlInjectionService.getSqlInjectionEntity(sqlInjectionEntity);
		if(result!=null){
			String currentURL = request.getRequestURI();
			String badStr = result.getValue();
			if(badStr!=null&&!badStr.trim().equals("")){
				if(!currentURL.equals("/mcms-portal/j_security_check.do")){
					Enumeration em = request.getParameterNames();
					while (em.hasMoreElements()) {
						String name = (String) em.nextElement();
						String value = request.getParameter(name);
						Pattern pattern = Pattern.compile(badStr);
						Matcher matcher = pattern.matcher(value.toLowerCase());
						boolean matches = matcher.matches();
						if(matches&&!value.trim().equals("")){
							sendRedirect(request, response, "/capital/allocation/sqlInjection.do");
							return;
						}
					}
				}else{
					Enumeration em = request.getParameterNames();
					while (em.hasMoreElements()) {
						String name = (String) em.nextElement();
						String value = request.getParameter(name);
						Pattern pattern = Pattern.compile(badStr);
						Matcher matcher = pattern.matcher(value.toLowerCase());
						boolean matches = matcher.matches();
						if(matches&&!value.trim().equals("")){
							sendRedirect(request, response, "/index.do");
							return;
						}

					}

				}
			}
		}
		filterChain.doFilter(request, response); 


	}


	protected void sendRedirect(HttpServletRequest request, HttpServletResponse response, String url)
			throws IOException {

		RedirectUtils.sendRedirect(request, response, url, false);
	}

	@Override
	public void destroy() {

	}

}


校验规则:

INSERT INTO SYS_DIC_PARAM( PARAM_KEY, PARAM_VALUE)
VALUES( 'sqlInjection', '''|and|exec|execute|insert|select|delete|update|count|drop|\\*|%|chr|mid|master|truncate|char|declare|sitename|net user|xp_cmdshell|;|or|-|\\+|,|like''|and|exec|execute|insert|create|drop|table|from|grant|use|group_concat|column_name|information_schema.columns|table_schema|union|where|select|delete|update|order|by|count|\\*|chr|mid|master|truncate|char|declare|or|;|-|--|\\+|,|like|//|/|%|#')




'|and|exec|execute|insert|select|delete|update|count|drop|\\*|%|chr|mid|master|truncate|char|declare|sitename|net user|xp_cmdshell|;|or|-|\\+|,|like'|and|exec|execute|insert|create|drop|table|from|grant|use|group_concat|column_name|information_schema.columns|table_schema|union|where|select|delete|update|order|by|count|\\*|chr|mid|master|truncate|char|declare|or|;|-|--|\\+|,|like|//|/|%|#

Filter 也称之为过滤器,它是Servlet2.3以上新增加的一个功能,其技术是非常强大的。通过Filter技术可以对WEB服务器的文件进行拦截过滤,从而实现一些特殊的功能。在JSP开发应用中也是必备的技能之一。

    Filter可以改变一个request(请求)和修改一个response(响应

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值