`

JDBC中的SQL注入问题:

阅读更多

JDBC中的SQL注入问题:
SQL注入是利用某些系统没有对用户输入数据进行充分的验证的情况下,用户输入了恶意的SQL命令,导致数据库完成了错误的命令,或者导致数据库崩溃的方法。

下面是一个实例:

 String sql = "select * from ATable where name='" + name + "'";
 state = conn.createStatement();
 rs = state.executeQuery(sql);
 // 显示查询结果
 while (rs.next()) {
     System.out.println(rs.getInt(1) + " " + rs.getString(2));
 }

如果这里传进来的是  String name = "'1' or '1'='1'";
拼接出来的SQL语句中where语句后面的条件是(select * from ATable where name='1' or '1'='1')永远都是成立。这会使Statement出现不可预料的结果。

为了解决这个问题。我们可以使用PrepareStatement。对上面没有验证的语句进行验证。

        Connection conn = DbUtils.getConnection(); 
        PreparedStatement state = null; 
        ResultSet rs = null; 
        try { 
            String sql = "select * from ATable where name=?"; 
            state = conn.prepareStatement(sql); 
            state.setString(1, name); 
            rs = state.executeQuery(); 
            // 显示查询结果 
            while (rs.next()) { 
                System.out.println(rs.getInt(1) + " " + rs.getString(2)); 
            } 
        } 

 

PreparedStatement继承了Statement,没有了SQL注入的问题。(preparedStatement进行了预编译。)

如果使用预编译语句.传入的任何内容就不会和原来的语句发生任何匹配的关系.

只要全使用预编译语句,你就用不着对传入的数据做任何过虑.

而如果使用普通的statement,就要对drop等做费尽心机的判断和过虑.

如上面的程序:state = conn.prepareStatement(sql);

state 对象包含语句"select * from ATable where name=?",它已发送给DBMS,并为执行作好了准备。

设定参数:state.setString(1, name);
一旦设置了给定语句的参数值,就可用它多次执行该语句,直到调用clearParameters 方法清除它为止。

在连接的缺省模式下(启用自动提交),当语句完成时将自动提交或还原该语句。

(完)

 

分享到:
评论

相关推荐

    sqljdbc和sqljdbc4 sqlserver最新驱动

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

    sqljdbc4-4.0.jar

    - 使用预编译的PreparedStatement,可以防止SQL注入攻击,并提高执行效率。 - 使用连接池管理数据库连接,减少频繁创建和关闭连接的开销。 - 设置合适的超时和重试策略,应对网络波动和数据库异常。 - 使用事务管理...

    如何解决sql注入问题

    #### SQL注入:Oracle与其他数据库对比 尽管SQL注入的概念对所有关系型数据库管理系统(RDBMS)都适用,但Oracle数据库因其独特的特性而面临特定类型的SQL注入威胁。例如,Oracle的PL/SQL语言提供了执行动态SQL的...

    jdbc连接sqlserver2005

    为了避免SQL注入攻击,推荐使用`PreparedStatement`。它可以预编译SQL语句,并允许动态参数化。 ```java String sql = "INSERT INTO myTable (name, age) VALUES (?, ?)"; PreparedStatement pstmt = conn.prepare...

    sqljdbc和sqljdbc4

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

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

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

    jdbc_sqlserver

    - `PreparedStatement`接口预编译SQL语句,提供更高效、安全的方式,尤其在处理参数时,防止SQL注入,如: ```java PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM myTable WHERE id = ?"); ...

    jdbc for sqlserver

    `Statement`适用于简单的静态SQL,而`PreparedStatement`更安全,支持参数化查询,防止SQL注入。 4. **执行SQL操作**:通过`executeQuery()`, `executeUpdate()`等方法执行SQL查询和修改操作。例如: ```java ...

    JDBC for sql 2012

    `Statement`适用于简单的非参数化查询,而`PreparedStatement`适用于参数化查询,能有效防止SQL注入攻击。 5. **处理结果集** 执行查询后,会返回一个`ResultSet`对象,我们可以遍历其中的行和列来获取数据。 ```...

    sqlserver驱动包:sqljdbc4.jar

    `PreparedStatement`允许预编译SQL,提高性能并防止SQL注入攻击。 5. **结果集处理**:`java.sql.ResultSet`接口代表了执行SQL查询后的结果。开发人员可以遍历结果集,获取和处理数据。 6. **事务管理**:JDBC驱动...

    sqljdbc4 (SQL连接驱动包)

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

    mybatissql_mybatis解决sql注入

    标题 "mybatissql_mybatis解决sql注入" 暗示了我们正在讨论MyBatis框架如何处理SQL注入问题。SQL注入是一种常见的安全漏洞,攻击者可以通过恶意输入篡改SQL查询,获取、修改或删除数据库中的敏感数据。MyBatis,作为...

    JDBC连接SQL 2000数据库驱动程序

    - `PreparedStatement`:预编译的SQL语句,更高效且可防止SQL注入。 - `ResultSet`:执行SQL查询后返回的结果集,可以遍历查询结果。 4. **最佳实践**: - 使用PreparedStatement而非Statement,以提高性能和...

    mybatis如何防止SQL注入

    这种方式虽然灵活,但容易导致SQL注入问题。例如: ```xml SELECT id, title, author, content FROM blog ORDER BY ${orderParam} ``` 如果`orderParam`的值没有经过恰当的处理,直接使用`ORDER BY ${...

    JDBC 连接SQL2005

    除了基本的连接和执行SQL,JDBC还支持预编译的PreparedStatement,用于提高性能和防止SQL注入。PreparedStatement允许在SQL语句中使用占位符,然后通过`setXXX()`方法设置参数。 此外,为了优化性能,可以使用...

    jdbc sqlserver2014

    `PreparedStatement`更安全,因为它允许预编译SQL,防止SQL注入。 4. **结果集处理**:执行查询后,结果会被返回为`ResultSet`对象。遍历结果集,获取每行数据并处理。 5. **事务管理**:JDBC支持事务控制,包括...

    sqljdbc42 jdbc for java

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

    sqljdbc 1.0 3.0 4.0

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

    SQL注入源码+SQL注入命令

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

    sqljdbc4.jar程序文件

    `PreparedStatement`提供了预编译的功能,能提高性能并减少SQL注入的风险。例如: ```java PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM Users WHERE id = ?"); pstmt.setInt(1, userId); ...

Global site tag (gtag.js) - Google Analytics