`
hz_chenwenbiao
  • 浏览: 1007957 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用PreparedStatement防止SQL注入(转)

阅读更多

一条效率差的sql语句,足以毁掉整个应用.

Statement是PreparedStatement的父接口,不进行预编译操作,减少了进行预编译的开销.单次运行PreparedStatement要比Statement要慢一些. 
PreparedStatement可以实现Statement的所有功能,但是之所以叫它预编译指令,是因为在创建它的一个对象时可以给定具有一定格式的SQL字符串,然后用它的setXXX方法给指定的SQL语句以填空的方式赋值,具有这样的特性后,它在多次执行一条固定格式的字符串时就很方便,也更效率.不像Statement那样每次执行都要先编译字符串在执行SQL了.

PreparedStatement需要服务器端的支持来提高效率.比如在Oracle上就会有显著效果,而MySQL明确地说明了不支持PreparedStatement.
Oracle中会将所有的SQL语句先编译,叫做"执行计划",放在Oracle内部的一个特定的缓存中,每次遇到相同的SQL,就会先调用缓存中的,如果不预编译,每次都用Statement,那么每次都要编译,在缓冲中会有很多重复的"执行计划"影响数据库的性能.还有一点就是在使用setObject()的时候,记得一定要使用带targetSqlType参数的方法,来提高效率.

SQL注入攻击是利用设计上的漏洞,在目标服务器上运行SQL语句进行攻击,动态生成SQL语句时没有对用户输入的数据进行验证是SQL注入攻击得逞的主要原因.
对于JDBC而言,SQL注入攻击只对Statement有效,对PreparedStatement是无效的,这是因为PreparedStatement不允许在插入时改变查询的逻辑结构.
绕过验证,但这种手段只对Statement有效,对PreparedStatement无效.

如果有一条SQL语句: "select * from 表 where 用户名 = '用户名'"
Statement的SQL语句是这样写的: "select * from 表 where 用户名 = '"+ 变量值 +"'"
PreparedStatement的SQL语句是这样写的: "select * from 表 where 用户名 = ?" 然后对应?赋值
这样我们就发现输入 "aa' or '1' = '1"
Statement是将这个和SQL语句做字符串连接到一起执行
PreparedStatement是将 "aa' or '1' = '1" 作为一个字符串赋值给?,做为"用户名"字段的对应值,显然这样SQL注入无从谈起了.

实现机制不同,注入只对SQL语句的准备(编译)过程有破坏作用,而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理,不再需要对SQL语句进行解析,准备,因此也就避免了SQL注入问题.

分享到:
评论
1 楼 wsdsgfuqiang 2011-07-25  
[align=left][/align]
引用

    [*]
[img][/img][url][/url][flash=200,200][/flash]
[b][/b][/i][i][/i][i][i][/i]   

相关推荐

    mybatis如何防止SQL注入

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

    Java防止SQL注入的几个途径

    使用 PreparedStatement 可以防止 SQL 注入攻击,因为攻击者不能 inject 恶意的 SQL 语句。 3.过滤用户的输入 在 WEB 层我们可以过滤用户的输入来防止 SQL 注入。例如,可以使用 Filter 来过滤全局的表单参数。...

    java防止SQL注入

    Java 防止 SQL 注入 Java 防止 SQL 注入是一个至关重要的安全问题,SQL 注入攻击是最常见的攻击方式之一,它不是利用操作系统或其他系统的漏洞来实现攻击的,而是程序员因为没有做好判断,被不法用户钻了 SQL 的...

    如何防止sql注入【转载】

    例如,使用 PreparedStatement 代替 Statement,可以避免 SQL 注入攻击。预编译语句还可以提高性能和可维护性。 其次,使用正则表达式可以检测 SQL meta-characters,从而防止恶意代码的注入。例如,可以使用正则...

    SQL注入原理以及Spring Boot如何防止SQL注入(含详细示例代码)

    防止SQL注入的方法主要包括: 1. 参数化查询:使用预编译的SQL语句(如PreparedStatement),将用户输入作为参数传递,而不是直接拼接到SQL字符串中。这样可以防止恶意代码改变SQL语句的结构。 2. 使用存储过程:...

    防止sql注入解决方案

    为了防止SQL注入,开发者需要采取一系列的预防措施,确保应用程序的安全性。以下是一些核心的解决方案: 1. **预编译语句(PreparedStatement)**: 题目中提到的预编译语句是防止SQL注入的关键技术。预编译语句在...

    防止sql注入demo

    - 使用预编译语句(PreparedStatement):这是防止SQL注入最常用的方法。预编译语句会将用户输入与SQL语句分离,确保即使输入含有恶意代码,也不会被执行。例如: ```java String query = "SELECT * FROM users ...

    java防sql注入攻击过滤器

    5. **使用预编译的SQL语句(PreparedStatement)**:除了过滤器之外,还应该使用PreparedStatement来执行SQL查询,因为它们可以自动防止基本的SQL注入攻击。预编译的语句会将参数与SQL语句分开处理,从而消除大部分...

    修改请求参数 防止 SQL 注入、防止脚本注入

    总的来说,防止SQL注入和XSS攻击是Web开发中的基础安全措施。通过理解这些攻击方式的工作原理,并在代码中实施相应的防护机制,我们可以大大降低系统被攻击的风险,保障用户数据的安全。记住,安全不是一次性的任务...

    jsp 防止sql注入jsp 防止sql注入

    使用预编译的SQL语句(例如PreparedStatement)是防止SQL注入的最佳实践。这种方式将SQL语句与用户输入的数据分离,确保即使用户输入恶意代码,也不会影响到查询结构。例如: ```java String query = "SELECT * ...

    如何防止SQL注入.pdf

    防止SQL注入主要依赖于以下几种方法: 1. 使用参数化查询(预编译语句) 参数化查询是防止SQL注入的最有效手段之一。通过使用预编译语句(例如,在Java中使用PreparedStatement),可以确保用户输入被当作参数处理...

    mybatis防止SQL注入的方法实例详解

    例如,在 mapper 文件中可以使用预编译语句来防止 SQL 注入: ```xml SELECT name FROM user where id = #{userId} ``` 在对应的 Java 文件中,可以使用预编译语句来避免 SQL 注入攻击: ```java public ...

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

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

    防止SQL注入dbq

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

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

    下面是一个使用Java的JDBC进行数据库查询的例子,这个例子使用了参数化查询,从而有效防止SQL注入攻击: ```java String user = "your_username"; String pwd = "your_password"; String url = "jdbc:mysql://...

    预加载防止sql注入

    下面是一个简单的Java代码示例,展示了如何使用预加载来防止SQL注入: ```java Connection conn = DriverManager.getConnection(DB_URL, USER, PASS); String sql = "SELECT * FROM Employees WHERE name = ?";...

    Hibernate使用中防止SQL注入的几种方案

    - 使用预编译的PreparedStatement,即使在没有使用Hibernate的情况下,这也是防止SQL注入的推荐方式。 - 对用户输入进行验证和清理,限制输入长度,禁止特定字符,如单引号、分号等。 - 使用最新的数据库驱动和...

    防止sql注入

    `占位符传递参数,这种方式能有效防止SQL注入,因为它会将参数值与SQL语句分开处理。 3. **最小权限原则**:创建并使用具有最小权限的数据库连接,不要让应用使用具有管理员权限的账户。这样即使发生SQL注入,攻击...

    SQL注入过滤 (Java版)

    但是,结合过滤器使用可以提供额外的安全层,防止未使用PreparedStatement的场景下出现SQL注入漏洞。 总之,Java中的SQL注入过滤器是保护应用程序免受SQL注入攻击的重要手段之一。通过在请求处理前对参数进行检查和...

    sql注入与防止

    下面是一个简单的Java Filter示例,展示了如何通过过滤器来防止SQL注入攻击: ```java public class SQLFilter implements Filter { private String inj_str = "'|and|exec|insert|select|delete|update|count|*|%...

Global site tag (gtag.js) - Google Analytics