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() {
}
}
分享到:
相关推荐
C# MVC 过滤器防止SQL注入
外网可能会被攻击,简单的处理可以避免! 外网可能会被攻击,简单的处理可以避免! 外网可能会被攻击,简单的处理可以避免! 外网可能会被攻击,简单的处理可以避免!...外网可能会被攻击,简单的处理可以避免!...
为了防止此类攻击,开发者通常会使用一种称为“SQL注入过滤器”的机制。本篇文章将深入探讨如何在Java中实现一个防SQL注入的过滤器,以及它的重要性。 SQL注入的原理是利用应用程序处理用户输入数据时的不足,将...
2. **SQL注入防护**:项目可能使用了Spring Data JPA、JdbcTemplate或MyBatis等持久层技术,这些库提供了防止SQL注入的功能。例如,通过使用参数化的`query()`或`update()`方法,可以确保即使输入含有恶意SQL片段,...
在使用MyBatis框架开发应用程序时,合理使用参数绑定技术(如`#{}`)以及对动态参数进行有效的过滤处理是防止SQL注入的关键。通过对MyBatis的正确配置和编程实践,可以大大降低应用程序面临的SQL注入风险,确保系统...
### 防止SQL注入过滤器配置详解 #### 一、引言 在现代Web应用开发中,安全性一直是至关重要的方面。SQL注入攻击是黑客常用的一种手段,它通过恶意SQL语句来破坏或操纵数据库中的数据。为了保护系统免受此类攻击,...
为了防止这种情况发生,开发者需要在应用程序中实施有效的防御策略,其中一种方法就是使用过滤器(Filter)进行SQL注入的过滤。本篇将详细探讨Java环境下如何实现一个SQL注入过滤器,并结合`web.xml`配置文件来部署...
配置在web.xml中,可以防止SQL注入,可以自己定义一些需要过滤的特殊字符
下面小编就为大家带来一篇JSP使用过滤器防止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注入demo"是针对这种威胁的一种防御措施,主要关注Java环境下的解决方案。下面我们将深入探讨SQL注入的基本原理、为何需要防止以及如何在Java中实现过滤器(Filter)来防止此类攻击。 1. SQL注入基础...
为了解决这一问题,我们可以利用Java的Filter机制来创建一个防止SQL注入的URL过滤器。下面将详细介绍这个过滤器的工作原理、配置方法以及如何有效地防止SQL注入。 首先,我们需要理解SQL注入的基本概念。SQL注入是...
本文将详细介绍如何使用Java Filter实现防止SQL注入的功能。 首先,我们需要创建一个实现了`javax.servlet.Filter`接口的类,例如名为`XSSFilter`。这个类将负责拦截请求并处理可能存在的SQL注入风险。下面是一个...
本示例中的`URLfilter`类就是一个简单的过滤器,它的主要目的是防止SQL注入攻击,这是一种常见的恶意攻击手段,攻击者试图通过输入恶意SQL语句来获取未经授权的数据或者破坏数据库。 SQL注入攻击通常是由于应用程序...
这个压缩包文件包含了一系列与Struts2相关的技术点,主要集中在错误页面配置、字符编码问题、防止SQL注入和Struts2框架的特性上。以下是这些知识点的详细解释: 1. **错误页面配置**: 在Web应用中,当请求无法...
- **参数化查询**:C#中的ADO.NET提供了参数化查询,如SqlCommand对象的Parameters属性,可以有效防止SQL注入。参数化查询确保输入数据被当作数据而不是代码执行。 - **存储过程**:使用存储过程可以限制数据库...
以下是对防止SQL注入的五种方法的详细说明: 1. 使用参数化查询(PreparedStatement) 参数化查询是预防SQL注入最有效的方法之一。在Java中,可以使用PreparedStatement对象来执行预编译的SQL语句。预编译的SQL...
本文将详细分析一个用于防止SQL注入的Java过滤器类——`Checksql`。 #### 类结构与功能 `Checksql`类实现了`javax.servlet.Filter`接口,主要负责对HTTP请求中的参数进行检查,以确保其不包含可能导致SQL注入攻击...