`
BradyZhu
  • 浏览: 261373 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JDBC学习之路(三)防止SQL注入,PreparedStatement探索

 
阅读更多

现在登录注册或者其他很多地方遇到用户输入的内容可以直接拿到数据库内部去进行执行SQL语句,这个是一项很危险的运动,因为你不知道用户会输入什么,如果用户对SQL语句很熟悉,他就可以在输入的时候加上''两个冒号作为特殊字符,这样的话会让计算机认为他输入的是SQL语句的关键字从而改变你的SQL语句,照成不可估量的损失,下面介绍防止此类事情发生的代码

package com.bird.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * @use1 preparedStatement可以做一些预处理工作,将特殊字符去除,保证查询安全
 * @use2 比起Statement速度更快
 * @use3 单次测试不好说,但是多次运行还是PreparedStatement运行块的
 * @author bird
 *
 */

public class SQLInsert {//使用PreStatement防止SQL注入攻击
	public static void read(String num) throws Exception{
		
		Connection conn = null;
		PreparedStatement pt = null;
		ResultSet rs = null;
		try{
			conn = JdbcUtil.getConnecttion();//建立连接
			
			String sql = "select * from niao where password = ?";//问号代替num
			pt = conn.prepareStatement(sql);//创建语句	
			pt.setString(1, num);
			
			rs = pt.executeQuery();//执行语句
			
			while(rs.next()){//得到数据
				System.out.println(rs.getObject("username")+"\t"+rs.getObject("password")+"\t"+rs.getObject("keywords")+"\t"
						+rs.getObject("userkeywords1")+"\t"+rs.getObject("time1")+"\t"+rs.getObject("userkeywords2")+"\t"
						+rs.getObject("time2")+"\t");
			}
		}finally{
			JdbcUtil.free(rs, pt, conn);
		}
		
		
	}
	
	public static void main(String [] args) throws Exception{
		read("123");
              //read("' or 2 or'");这句话包含了两个单引号,会让计算机认为是SQL关键字很危险
	}
}

1.PreparedStatement是继承自Statement, 可以说Statement能做的事情他都能做。

2.PreparedStatement可以对你输入的SQL语句进行预处理,删除那些特殊字符和危险

字符,非常有好处,给开发者帮助

3.PreparedStatement对SQL执行进行了优化,对于多次大量的SQL查询,效率要比Statement快的很多,建议能用它就用他

分享到:
评论

相关推荐

    mybatis如何防止SQL注入

    ### MyBatis如何防止SQL注入 #### SQL注入简介与危害 SQL注入是一种常见的Web应用程序安全漏洞,攻击者可以通过提交恶意的SQL代码到应用程序的输入字段中(如表单、URL等),利用这些输入来操控数据库执行非预期的...

    sqljdbc和sqljdbc4 sqlserver最新驱动

    在实际使用时,要注意安全最佳实践,比如避免SQL注入,使用预编译的PreparedStatement,及时关闭数据库连接,以及考虑使用连接池以提高性能和资源管理。 7. 兼容性: 这些驱动通常兼容各种SQL Server版本,包括...

    如何获得PreparedStatement最终执行的sql语句

    当我们处理大量重复的SQL操作时,使用`PreparedStatement`可以避免SQL注入等问题,同时提升性能。这篇博客可能是探讨如何在实际运行中获取`PreparedStatement`最终执行的SQL语句,这对于调试和分析数据库操作非常有...

    Java-JDBC【源码】JDBC概述、获取连接、SQL注入问题与解决、查询解析

    Java-JDBC【之】JDBC概述、获取连接、SQL注入问题与解决、查询解析 1.JDBC概述 2.操作流程 1.初始化项目,导入`驱动jar包` 2.加载驱动类 3.创建数据库连接对象`Connection` 4.创建`Statement` (此处存在SQL注入问题)...

    JDBCDriver3.0.rar_jdbc driver 3.0_sql jdbc 3.0_sql server jdbc_s

    2. **预编译语句(PreparedStatement)**:预编译的SQL语句可以显著提升执行速度,同时防止SQL注入攻击。 3. **批处理操作**:允许多个SQL语句一次性提交,减少网络通信次数,提高整体执行效率。 4. **游标支持**:...

    JDBC如何有效防止SQL注入?

    在Java的JDBC编程中,防止SQL注入至关重要,以下是一些有效的策略: 1. **预编译SQL语句(PreparedStatement)**: 使用`PreparedStatement`代替`Statement`是防止SQL注入的基本方法。预编译的SQL语句将参数化查询...

    sqljdbc4.jar依赖包

    - 为了安全起见,推荐使用PreparedStatement而非Statement,以防止SQL注入。 总结,sqljdbc4.jar是连接Java应用程序与SQL Server数据库的关键工具,通过其丰富的功能和接口,开发者可以高效、安全地进行数据库操作...

    sqljdbc 1.0 3.0 4.0

    PreparedStatement是预编译的,通常用于提高性能并防止SQL注入攻击。 4. `ResultSet`: 执行查询后返回的结果集,可以遍历并获取数据。 在使用SQL Server JDBC Driver时,开发者通常需要执行以下步骤: 1. 加载和...

    可注入SQL的代码、防止SQL注入

    #### 三、防止SQL注入的方法 为了防止SQL注入,可以采取以下几种措施: 1. **使用参数化查询或预编译语句**:这种方式可以确保SQL查询在任何情况下都不会被改变,输入的内容始终只会被视为数据,而不是SQL代码的一...

    sqljdbc4 (SQL连接驱动包)

    `PreparedStatement`预编译SQL,提高性能,并防止SQL注入攻击;`CallableStatement`用于调用存储过程。 5. **结果集处理**:`ResultSet`接口用于存储查询结果。开发者可以通过迭代`ResultSet`对象来获取和处理数据...

    防止SQL注入dbq

    1. **预编译语句(PreparedStatement)**:Java的JDBC提供预编译语句接口,可以有效地防止SQL注入。预编译语句将SQL语句模板与参数分开处理,如: ```java String sql = "SELECT * FROM Users WHERE ID = ?"; ...

    SQL注入源码+SQL注入命令

    正确的方法是使用参数化查询,例如预编译的`PreparedStatement`,以防止SQL注入: ```java String sql = "SELECT * FROM users WHERE id=?"; PreparedStatement pstmt = connection.prepareStatement(sql); pstmt....

    预加载防止sql注入

    为了防止这种情况发生,开发者通常会采用预加载(Prepared Statements)技术,这就是“预加载防止SQL注入”的核心概念。本文将深入探讨预加载的工作原理、优势以及如何在实际应用中使用。 预加载,也称为参数化查询...

    如何解决sql注入问题

    - **绑定变量**:使用预编译的语句和绑定变量可以防止SQL注入,因为它们将数据和SQL指令分离。 - **输入验证**:应用严格的输入验证规则,拒绝任何包含潜在危险字符或格式的输入。 - **函数安全性**:限制对数据库...

    sql注入原理简介

    Java数据库连接(JDBC)中的PreparedStatement具有防止SQL注入的功能,它不允许在不同的插入时间改变查询的结构,因此即使用户输入了恶意代码,也不会被当做SQL语句的一部分执行。 在Web开发中,预防SQL注入的常用...

    sqljdbc41的jar包

    4. 预编译的SQL语句:`PreparedStatement`可以预编译SQL语句,提高性能,防止SQL注入攻击。 5. 事务管理:支持开始、提交、回滚事务。 6. 游标支持:允许向前和向后滚动结果集,以及在处理大量数据时提高效率。 7. ...

    sqljdbc42 jdbc for java

    3. 参数化查询:避免SQL注入攻击,应使用PreparedStatement进行参数化查询。 4. 使用JDBC 4.2新特性:如利用try-with-resources语法自动关闭资源,简化代码。 总结,SQLJDBC42作为Java与SQL Server之间的关键接口,...

    sqljdbc和sqljdbc4

    此外,使用PreparedStatement可以防止SQL注入攻击,通过预编译SQL语句并用占位符替换动态参数。 **性能优化**:SQLJDBC4还提供了性能优化选项,例如批处理操作,允许一次提交多个SQL语句,减少网络往返次数。还可以...

    sqlserver在JDK1.6用的JDBC

    5. **执行SQL语句**:`Statement`用于执行静态SQL,而`PreparedStatement`用于执行预编译的SQL,提高性能并防止SQL注入。 6. **事务管理**:JDBC支持事务的开始、提交、回滚操作,对于需要保证数据一致性的操作尤为...

    sqljdbc.jar sqljdbc4.jar

    7. **预编译语句**:`PreparedStatement`允许预编译SQL语句,提升性能,同时防止SQL注入攻击。 8. **连接池管理**:在实际应用中,通常会配合连接池(如C3P0、HikariCP、Apache DBCP等)使用,提高资源利用率和系统...

Global site tag (gtag.js) - Google Analytics