防SQL注入过滤器的实现


1- 配置web.xml,增加过滤器配置

  <filter> 
    <filter-name>PreventSqlInject</filter-name> 
    <filter-class>SqlInjectFilter</filter-class> 
    <!--split with blank --> 
    <init-param> 
        <param-name>sensitive-words</param-name> 
        <param-value>select insert delete from update create destory drop alter and or like exec count chr mid master truncate char declare ; ' % &lt; &gt;</param-value> 
    </init-param> 
    <!--split with blank --> 
    <init-param> 
        <param-name>encrypting-parameter-names</param-name> 
        <param-value>username password</param-value> 
    </init-param>
    <!-- error page --> 
    <init-param>
        <param-name>error-page</param-name> 
        <param-value>/sqlInjectError.jsp</param-value> 
    </init-param> 
    <!-- debug -->     
    <init-param> 
        <param-name>debug</param-name> 
        <param-value>false</param-value> 
    </init-param> 
  </filter> 
  <filter-mapping> 
    <filter-name>PreventSqlInject</filter-name> 
    <url-pattern>/*</url-pattern> 
  </filter-mapping>

2- 实现过滤器 SqlInjectFilter

import java.io.IOException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
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.commons.codec.binary.Base64;

public class SqlInjectFilter implements Filter {

	// SQL 注入敏感词列表
	private static List<String> sensWords = new ArrayList<String>();
	// Base64 加密参数key列表
	private static List<String> encrParams=new ArrayList<String>();
	// 错误页面
	private static String error = "/sqlInjectError.jsp";
	// 调试开关
	private static boolean debug = false;

	@Override
	public void destroy() {

	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc)
			throws IOException, ServletException {
		if (debug) {
			System.out.println("prevent sql inject filter works");
		}
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) res;
		request.setCharacterEncoding("UTF-8");
		Set<String> keys = request.getParameterMap().keySet();
		for (String key : keys) {
			String value = request.getParameter(key);
			if(encrParams.contains(key)){
				value=new String(Base64.decodeBase64(value.getBytes()));
			}
			if (debug) {		
				System.out.println(MessageFormat.format("{0}={1}", key,value));
			}
			for (String word : sensWords) {
				if( value.toUpperCase().contains(word.toUpperCase()) ){
					request.getSession().setAttribute(
							"sqlInjectError",
							"the request parameter \"" + value
									+ "\" contains keyword: \"" + word + "\"");
					response.sendRedirect(request.getContextPath() + error);
					return;
				}
			}
		}
		fc.doFilter(req, res);
	}

	@Override
	public void init(FilterConfig conf) throws ServletException {
		String sSensiWord = conf.getInitParameter("sensitive-words");
		String sEncryParam = conf.getInitParameter("encrypting-parameter-names");
		String errorPage = conf.getInitParameter("error-page");
		String de = conf.getInitParameter("debug");
		if (errorPage != null) {
			error = errorPage;
		}
		if(sSensiWord!=null){
			sensWords=Arrays.asList(sSensiWord.split(" "));
		}
		if(sEncryParam!=null){
			encrParams=Arrays.asList(sEncryParam.split(" "));
		}
		if (de != null && Boolean.parseBoolean(de)) {
			debug = true;
			System.out.println("PreventSQLInject Filter staring...");
			System.out.println("print filter details");
			System.out.println("sensitive words as fllows (split with blank):");
			for (String s : sensWords) {
				System.out.print(s + " ");
			}
			System.out.println();
			System.out.println("encrypting parameter key as fllows (split with blank):");
			for (String s : encrParams) {
				System.out.print(s + " ");
			}
			System.out.println();
			System.out.println("error page as fllows");
			System.out.println(error);
			System.out.println();
		}
	}

}

3-新增 errorPage 页面  sqlInjectError.jsp

<%@ page language="java" import="java.util.*" contentType="text/html;charset=utf-8" %> 
<% 
String path = request.getContextPath(); 
%> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
  <head> 
    <title>防sql注入系统</title> 
  </head> 
   
  <body>
  <h6>
  	&nbsp;&nbsp;
    <font color="red">这个是防sql注入系统,自动过滤您的请求,请更换请求字符串。 </font>
    <%=session.getAttribute("sqlInjectError")%>
  </h6>  
  </body> 
</html>


转载于:https://my.oschina.net/freegarden/blog/646387

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、什么是XSS攻击 XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞由于被黑客用来编写危害性更大的网络钓鱼(Phishing)攻击而变得广为人知。对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的“缓冲区溢出攻击“,而JavaScript是新型的“ShellCode”。 二、XSS漏洞的危害 (1)网络钓鱼,包括盗取各类用户账号; (2)窃取用户cookies资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作; (3)劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转账、强制发表日志、发送电子邮件等; (4)强制弹出广告页面、刷流量等; (5)网页挂马; (6)进行恶意操作,例如任意篡改页面信息、删除文章等; (7)进行大量的客户端攻击,如DDoS攻击; (8)获取客户端信息,例如用户的浏览历史、真实IP、开放端口等; (9)控制受害者机器向其他网站发起攻击; (10)结合其他漏洞,如CSRF漏洞,实施进一步作恶; (11)提升用户权限,包括进一步渗透网站; (12)传播跨站脚本蠕虫等; 三、过滤器配置 web.xml配置 XssFilter com.xxx.Filter.XssFilter XssFilter /*

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值