文档章节

防SQL注入过滤器的实现

天冰
 天冰
发布于 2016/03/24 09:35
字数 472
阅读 169
收藏 2


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>


© 著作权归作者所有

上一篇: TCP、UDP、HTTP
下一篇: struts2升级
天冰
粉丝 6
博文 24
码字总数 17657
作品 0
程序员
私信 提问
SQL注入攻击高级

原文出处:i春秋学院 前言 前面我们学习了如何寻找,确认,利用SQL注入漏洞的技术,本篇文章我将介绍一些更高级的技术,避开过滤,绕开防御。有攻必有防,当然还要来探讨一下SQL注入防御技巧...

i春秋学院
2016/09/01
0
0
网站的安全隐患与对策

下面我给大家稍微讲讲一下几个方面的web安全问题与对策 1)SQL注入挂马 2)网络带宽耗尽(迅雷等资源盗链) 3)DDOS攻击 4)XSS Worm 5)网页被篡改 6)ARP挂马 首先给大家介绍下SQL注入挂马...

红薯
2009/05/11
366
3
Laravel 5.3之 Query Builder 源码解析(中)

说明:本篇主要学习数据库连接阶段和编译SQL语句部分相关源码。实际上,上篇已经聊到通过连接工厂类构造出了实例(假设驱动driver是mysql),在该MySqlConnection中主要有三件利器:;;,其中是...

botkenni
2016/12/05
30
0
防注入组件的编写 (asp.net C#)

经常要写一些.net的程序,对于数据库的防注入要求要比较高。这时我从网上搜了一些代码。查看了一下主要是通过HTTPModel来进行对客户端转过来的数据进行处理。 在服务器安全栏目里我写过一篇《...

孟宪迎
2009/12/27
415
0
PHP 如何安全的使用 MySQL ?

大多数 PHP 程序员对 MySQL 肯定不陌生,至于各种 MySQL 函数的用法在开发手册和 w3school 这类网站上也有很多介绍。但是,你所用的写法真的安全吗?面对越来越猖獗的黑客攻击,SQL 注入防范...

OneAPM蓝海讯通
2016/01/19
60
0

没有更多内容

加载失败,请刷新页面

加载更多

可能是国内第一篇全面解读 Java 现状及趋势的文章

作者 | 张晓楠 Dragonwell JDK 最新版本 8.1.1-GA 发布,包括全新特性和更新! 导读:InfoQ 发布《2019 中国 Java 发展趋势报告》,反映 Java 在中国发展的独特性,同时也希望大家对 Java 有...

阿里云官方博客
4分钟前
1
0
Spring Boot 2.x基础教程:Swagger静态文档的生成

前言 通过之前的两篇关于Swagger入门以及具体使用细节的介绍之后,我们已经能够轻松地为Spring MVC的Web项目自动构建出API文档了。如果您还不熟悉这块,可以先阅读: Spring Boot 2.x基础教程...

程序猿DD
8分钟前
1
0
《毅力》读书笔记

1.确信你全身心地投入 2.准备好为目标进行艰难的跋涉 3.通过减少需要使用毅力的情形,为将来的挑战做好准备 4.尽可能具体细致地确定你的目标和实现目标的过程 5.把挑战分解为小而易于管理的小...

lingch
9分钟前
2
0
zk中快速选举FastLeaderElection实现

选举涉及概念 服务器状态 投票 如何选择投票? 协议 选举 如何进行选举? epoch 发送者 接收者 发送队列 接收队列 服务器状态 public enum ServerState { LOOKING,寻找Leader状态,当服务处于...

writeademo
12分钟前
1
0
教你玩转Linux—磁盘管理

Linux磁盘管理好坏直接关系到整个系统的性能问题,Linux磁盘管理常用三个命令为df、du和fdisk。 df df命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少...

Linux就该这么学
14分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部