`
greenwen
  • 浏览: 220150 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

过滤器防止sql注入

阅读更多


import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

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.logging.Log;
import org.apache.commons.logging.LogFactory;

public class SqlInjFilter implements Filter {

	private static Log log = LogFactory.getLog(SqlInjFilter.class);

	private String[] riskStrs = new String[] { "like", "and", "or", "select",
			"1=1" };

	private String errorPageUrl = "******";

	private Map<String, String> riskStrMap = new HashMap<String, String>();
	
	private String charEncoding = "utf-8";

	private int maxValueLength = -1;
	private int maxParaNum = -1;

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {

		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;

		String validateStr = reqValidate(req);

		if (validateStr != null) {
			String sourceIp = req.getRemoteAddr();
			String requestURL = req.getRequestURL().toString();
			log.error("Sql injection risk, the source ip is " + sourceIp
					+ ", the request URL is '" + requestURL
					+ "',  parameter info: '" + validateStr + "'.");
			res.sendRedirect(errorPageUrl);

		} else {
			chain.doFilter(req, res);
		}
	}

	protected String reqValidate(HttpServletRequest req) throws UnsupportedEncodingException {

		req.setCharacterEncoding(charEncoding);
		Enumeration params = req.getParameterNames();
			
		int paramCount = 0;
		while (params.hasMoreElements()) {
			
			paramCount ++;
			if(maxParaNum != -1 && paramCount > maxParaNum)
			{
				return "parameter is to much,over max Parameter Number " + maxParaNum;
				
			}
			
			String name = params.nextElement().toString();
			String[] values = req.getParameterValues(name);

			for (String value : values) {

				if (maxValueLength != -1 && value.length() > maxValueLength) {

					return "the value of '" + name
							+ "'is too big, the length is " + value.length();
				}

				if (isSqlSnippet(value)) {
					return name + ":" + value;

				}
			}

		}
		return null;
	}

	protected boolean isSqlSnippet(String str) {

		if (str == null || str.trim().length() == 0)
			return false;
		str = str.trim().toLowerCase();

		StringTokenizer strTokenizer = new StringTokenizer(str);

		while (strTokenizer.hasMoreTokens()) {
			if (riskStrMap.containsKey(strTokenizer.nextToken())) {
				return true;
			}
		}

		return false;
	}

	public void init(FilterConfig filterConfig) throws ServletException {
		
		//characterEncoding
		String characterEncoding = filterConfig.getInitParameter("characterEncoding");
		if (characterEncoding != null && characterEncoding.trim() != "") {
			charEncoding = characterEncoding;
		}
		
		// risk string
		String riskPattern = filterConfig.getInitParameter("riskPattern");
		if (riskPattern != null && riskPattern.trim() != "") {
			riskStrs = riskPattern.trim().split("\\|");
		}

		for (String riskStr : riskStrs) {
			riskStrMap.put(riskStr, "");
		}

		// error page
		String errorUrl = filterConfig.getInitParameter("errorPageUrl");
		if (errorUrl != null && errorUrl.trim() != "") {
			errorPageUrl = errorUrl.trim();
		}

		// maxValueLength
		String valueLength = filterConfig.getInitParameter("maxValueLength");

		if (valueLength != null && valueLength.trim() != "") {
			maxValueLength = new Integer(valueLength).intValue();
		}

		// max paraNum
		String paraNum = filterConfig.getInitParameter("maxParaNum");
		if (paraNum != null && paraNum.trim() != "") {
			maxParaNum = new Integer(paraNum).intValue();
		}

	}

	public void destroy() {

	}


}
0
4
分享到:
评论

相关推荐

    C# MVC 过滤器防止SQL注入

    C# MVC 过滤器防止SQL注入

    java过滤器防sql注入

    外网可能会被攻击,简单的处理可以避免! 外网可能会被攻击,简单的处理可以避免! 外网可能会被攻击,简单的处理可以避免! 外网可能会被攻击,简单的处理可以避免!...外网可能会被攻击,简单的处理可以避免!...

    java防sql注入攻击过滤器

    为了防止此类攻击,开发者通常会使用一种称为“SQL注入过滤器”的机制。本篇文章将深入探讨如何在Java中实现一个防SQL注入的过滤器,以及它的重要性。 SQL注入的原理是利用应用程序处理用户输入数据时的不足,将...

    java web Xss及sql注入过滤器.zip

    2. **SQL注入防护**:项目可能使用了Spring Data JPA、JdbcTemplate或MyBatis等持久层技术,这些库提供了防止SQL注入的功能。例如,通过使用参数化的`query()`或`update()`方法,可以确保即使输入含有恶意SQL片段,...

    mybatis如何防止SQL注入

    在使用MyBatis框架开发应用程序时,合理使用参数绑定技术(如`#{}`)以及对动态参数进行有效的过滤处理是防止SQL注入的关键。通过对MyBatis的正确配置和编程实践,可以大大降低应用程序面临的SQL注入风险,确保系统...

    防止sql注入过滤器配置

    ### 防止SQL注入过滤器配置详解 #### 一、引言 在现代Web应用开发中,安全性一直是至关重要的方面。SQL注入攻击是黑客常用的一种手段,它通过恶意SQL语句来破坏或操纵数据库中的数据。为了保护系统免受此类攻击,...

    SQL注入过滤 (Java版)

    为了防止这种情况发生,开发者需要在应用程序中实施有效的防御策略,其中一种方法就是使用过滤器(Filter)进行SQL注入的过滤。本篇将详细探讨Java环境下如何实现一个SQL注入过滤器,并结合`web.xml`配置文件来部署...

    sql注入Java过滤器

    配置在web.xml中,可以防止SQL注入,可以自己定义一些需要过滤的特殊字符

    JSP使用过滤器防止SQL注入的简单实现

    下面小编就为大家带来一篇JSP使用过滤器防止SQL注入的简单实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    asp防止SQL注入和SQL注入资料

    asp防止SQL注入和SQL注入资料;asp;asp sql;asp防注入asp防止SQL注入和SQL注入资料;asp;asp sql;asp防注入asp防止SQL注入和SQL注入资料;asp;asp sql;asp防注入 asp的朋友可以看看 分享

    防止sql注入的url过滤器

    防止sql注入的url过滤器,这个平时用到过得、觉得不错、所以跟大家分享下、

    防止sql注入demo

    本示例"防止SQL注入demo"是针对这种威胁的一种防御措施,主要关注Java环境下的解决方案。下面我们将深入探讨SQL注入的基本原理、为何需要防止以及如何在Java中实现过滤器(Filter)来防止此类攻击。 1. SQL注入基础...

    防止sql注入的url过滤器【java filter】

    为了解决这一问题,我们可以利用Java的Filter机制来创建一个防止SQL注入的URL过滤器。下面将详细介绍这个过滤器的工作原理、配置方法以及如何有效地防止SQL注入。 首先,我们需要理解SQL注入的基本概念。SQL注入是...

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

    本文将详细介绍如何使用Java Filter实现防止SQL注入的功能。 首先,我们需要创建一个实现了`javax.servlet.Filter`接口的类,例如名为`XSSFilter`。这个类将负责拦截请求并处理可能存在的SQL注入风险。下面是一个...

    filter过滤器防止恶意注入

    本示例中的`URLfilter`类就是一个简单的过滤器,它的主要目的是防止SQL注入攻击,这是一种常见的恶意攻击手段,攻击者试图通过输入恶意SQL语句来获取未经授权的数据或者破坏数据库。 SQL注入攻击通常是由于应用程序...

    struts2技巧,笔记.zip指定404,500页面 utf-8过滤器 防SQL注入 解决乱码

    这个压缩包文件包含了一系列与Struts2相关的技术点,主要集中在错误页面配置、字符编码问题、防止SQL注入和Struts2框架的特性上。以下是这些知识点的详细解释: 1. **错误页面配置**: 在Web应用中,当请求无法...

    C#写的防止SQL注入式攻击的软件 可以作为课程设计

    - **参数化查询**:C#中的ADO.NET提供了参数化查询,如SqlCommand对象的Parameters属性,可以有效防止SQL注入。参数化查询确保输入数据被当作数据而不是代码执行。 - **存储过程**:使用存储过程可以限制数据库...

    有效防止SQL注入的5种方法总结

    以下是对防止SQL注入的五种方法的详细说明: 1. 使用参数化查询(PreparedStatement) 参数化查询是预防SQL注入最有效的方法之一。在Java中,可以使用PreparedStatement对象来执行预编译的SQL语句。预编译的SQL...

    防止sql注入的java代码

    本文将详细分析一个用于防止SQL注入的Java过滤器类——`Checksql`。 #### 类结构与功能 `Checksql`类实现了`javax.servlet.Filter`接口,主要负责对HTTP请求中的参数进行检查,以确保其不包含可能导致SQL注入攻击...

Global site tag (gtag.js) - Google Analytics