`

Java防止SQL注入的几个途径

阅读更多
java防SQL注入,最简单的办法是杜绝SQL拼接,SQL注入攻击能得逞是因为在原有SQL语句中加入了新的逻辑,如果使用PreparedStatement来代替Statement来执行SQL语句,其后只是输入参数,SQL注入攻击手段将无效,这是因为PreparedStatement不允许在不同的插入时间改变查询的逻辑结构 ,大部分的SQL注入已经挡住了, 在WEB层我们可以过滤用户的输入来防止SQL注入比如用Filter来过滤全局的表单参数
01	import java.io.IOException;
02	import java.util.Iterator;
03	import javax.servlet.Filter;
04	import javax.servlet.FilterChain;
05	import javax.servlet.FilterConfig;
06	import javax.servlet.ServletException;
07	import javax.servlet.ServletRequest;
08	import javax.servlet.ServletResponse;
09	import javax.servlet.http.HttpServletRequest;
10	import javax.servlet.http.HttpServletResponse;
11	/**
12	* 通过Filter过滤器来防SQL注入攻击
13	*
14	*/
15	public class SQLFilter implements Filter {
16	private String inj_str = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|; |or|-|+|,";
17	protected FilterConfig filterConfig = null;
18	/**
19	* Should a character encoding specified by the client be ignored?
20	*/
21	protected boolean ignore = true;
22	public void init(FilterConfig config) throws ServletException {
23	this.filterConfig = config;
24	this.inj_str = filterConfig.getInitParameter("keywords");
25	}
26	public void doFilter(ServletRequest request, ServletResponse response,
27	FilterChain chain) throws IOException, ServletException {
28	HttpServletRequest req = (HttpServletRequest)request;
29	HttpServletResponse res = (HttpServletResponse)response;
30	Iterator values = req.getParameterMap().values().iterator();//获取所有的表单参数
31	while(values.hasNext()){
32	String[] value = (String[])values.next();
33	for(int i = 0;i < value.length;i++){
34	if(sql_inj(value[i])){
35	//TODO这里发现sql注入代码的业务逻辑代码
36	return;
37	}
38	}
39	}
40	chain.doFilter(request, response);
41	}
42	public boolean sql_inj(String str)
43	{
44	String[] inj_stra=inj_str.split("\\|");
45	for (int i=0 ; i < inj_stra.length ; i++ )
46	{
47	if (str.indexOf(" "+inj_stra[i]+" ")>=0)
48	{
49	return true;
50	}
51	}
52	return false;
53	}
54	}

也可以单独在需要防范SQL注入的JavaBean的字段上过滤:
1	/**
2	* 防止sql注入
3	*
4	* @param sql
5	* @return
6	*/
7	public static String TransactSQLInjection(String sql) {
8	return sql.replaceAll(".*([';]+|(--)+).*", " ");
9	}
分享到:
评论
2 楼 seraph_fd 2014-01-14  
好厉害的样子。

最近用手拼 SQL 句子做了很多东西,现在要统一做防 SQL 注入,瞬间感觉世界上已经没有爱了
1 楼 一叶一菩提 2013-12-17  
你考虑过  in 吗?
preparedstatement不支持对 in进行 set的;
这是个 底层BUG

相关推荐

    自己动手编写SQL注入漏洞扫描工具

    编写SQL注入扫描工具,我们需要关注以下几个关键点: 1. **目标识别**:确定要扫描的目标网站或Web应用,收集其URL结构和可能的输入点。 2. **数据构造**:创建一系列测试用例,包括常见的注入字符串,如`' OR 1=1...

    sqljdbc4-4.0.zip

    7. **安全性**:考虑使用`PreparedStatement`而不是`Statement`,因为前者可以防止SQL注入攻击,并且通常更高效。 8. **事务管理**:JDBC支持事务,你可以通过`Connection`对象的`setAutoCommit()`和`commit()`方法...

    java毕设课设-Jsp+sql毕业选题系统(论文).zip

    系统的架构可能包括以下几个主要部分: 1. 用户界面:由JSP页面组成,用户可以通过这个界面进行登录、查看选题、提交选题申请等操作。 2. 控制层:这部分主要由Servlet或者JSP的Action类组成,负责接收用户的请求,...

    SQL Server2000的JDBC驱动

    同时,理解和遵循最佳实践,比如使用预编译语句防止SQL注入,以及正确管理数据库连接以优化资源使用,都是提升Java应用数据库交互效率的关键。 总之,SQL Server 2000的JDBC驱动为Java开发者提供了一种直接、高效的...

    JAVA在线答疑系统

    10. **安全性**:系统应考虑安全性,包括防止SQL注入、XSS攻击、CSRF攻击等,这需要开发者遵循最佳安全实践。 通过学习和实践这个"JAVA在线答疑系统"项目,你可以深化对Java Web开发的理解,掌握MVC架构、数据库...

    sql server jdbc

    3. 创建Statement或PreparedStatement对象:根据需求,你可以创建Statement用于执行静态SQL,或者创建PreparedStatement用于执行预编译的SQL,以提高性能并防止SQL注入。 4. 执行SQL:调用Statement或...

    JAVA网上购书系统

    7. 安全性考虑:系统应包含防止SQL注入、XSS攻击等安全措施,确保用户数据的安全。 8. 性能优化:通过缓存技术、负载均衡等手段,提升系统的响应速度和并发处理能力。 在开发过程中,开发团队可能会使用MVC(Model...

    2018 Java 工程师面试总结

    12. **安全问题**:防止SQL注入是开发中的重要任务,面试可能会问到你的实践经验和相关知识。 13. **操作系统**:在Linux环境下,了解如何查看CPU使用率,这是基本的操作技能。 14. **多态**:Java中的多态性是...

    Java基础学习34.pdf

    - **PreparedStatement**:预编译的SQL语句,可以防止SQL注入攻击,提高性能。例如,使用`PreparedStatement`时,你可以使用占位符(问号`?`),然后通过设置参数来替换它们。 ```java String sql = "INSERT INTO ...

    java项目之小区门户网站源码.zip

    6. **安全性**:检查项目中是否包含了防止SQL注入、XSS攻击等安全措施,理解如何保护用户数据的安全。 7. **单元测试与集成测试**:查看是否存在JUnit或其他测试框架的代码,理解如何验证和保证代码质量。 通过...

    jeecms-src.zip_jeecms_安全管理 Java

    2. **SQL注入防护**:Jeecms采用预编译SQL语句(PreparedStatement)来防止SQL注入攻击,同时对用户输入进行严格的过滤和校验,降低数据库被恶意篡改的风险。 3. **XSS防护**:通过输出内容的编码和过滤,Jeecms...

    java保险系统项目源码

    "Insurance"可能是一个包含整个项目源代码的文件或目录,其中可能有以下几个关键部分: 1. **源码结构**:通常会有一个src/main/java目录,存放所有的Java源代码,按照包结构组织,如com.insurance.action(Struts2...

    MySQL约束_java_资料.zip

    开发者通过编写SQL语句来定义和操作包含约束的表,并使用PreparedStatement对象来安全地执行这些语句,防止SQL注入攻击。此外,ORM框架如Hibernate和MyBatis可以帮助简化数据库操作,自动处理约束验证和事务管理。 ...

    JDBC内容之宋红康版本

    JDBC 体系结构主要包含以下几个部分:DriverManager、Driver、Connection、Statement、ResultSet。其中,DriverManager 负责管理 JDBC驱动程序;Driver 负责连接数据库;Connection 负责维护数据库连接;Statement ...

    java web 论坛

    在Java Web论坛中,核心的技术栈可能包括以下几个方面: 1. **Servlet与JSP**:Servlet是Java EE平台中的基础组件,用于处理HTTP请求和响应。JSP(Java Server Pages)则是一种动态网页技术,可以将HTML代码与Java...

    java众望书城网上系统

    系统设计上,可能包括以下几个主要模块:用户管理模块,用于处理用户注册、登录、个人信息管理等功能;图书展示模块,用于展示各类图书,提供搜索和分类浏览;购物车模块,实现商品添加、删除以及结算功能;订单处理...

    Java web随手记,持续更新

    在Java Web开发中,以下几个关键知识点是不可或缺的: 1. **Servlet**:Servlet是Java Web应用的核心组件,用于接收和响应HTTP请求。了解Servlet生命周期、如何编写Servlet以及Servlet配置是基础。 2. **JSP(Java...

    java经典项目

    13. **安全机制**:包括认证(如JWT)、授权(如OAuth2.0)、防止SQL注入和XSS攻击等,确保系统安全。 14. **日志记录**:如Log4j、SLF4J等,用于收集运行时信息,便于问题排查和性能监控。 15. **性能优化**:...

Global site tag (gtag.js) - Google Analytics