`

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注入问题.

引自:http://blog.csdn.net/maxracer/article/details/6118036

分享到:
评论

相关推荐

    mybatis如何防止SQL注入

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

    Java防止SQL注入的几个途径

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

    java防止SQL注入

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

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

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

    如何防止sql注入【转载】

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

    防止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语句分开处理,从而消除大部分...

    利用JDBC工具类的方式实现mysql数据库的连接并且完成登录相关功能(防sql注入方式)

    在本示例中,我们将探讨如何使用JDBC(Java Database Connectivity)工具类与MySQL数据库建立连接,并实现登录功能,同时重点介绍如何利用PreparedStatement防止SQL注入攻击。 首先,JDBC是Java语言访问数据库的...

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

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

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

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

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

    MyBatis 防止 SQL 注入的方法实例详解 SQL 注入是一种简单的攻击手段,但直到今天仍然十分常见。MyBatis 作为一个流行的持久层框架,如何防止 SQL 注入呢?下面我们将详细介绍 MyBatis 防止 SQL 注入的方法实例详解...

    防止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注入

    ### 可注入SQL的代码与防止SQL注入 #### 一、SQL注入简介 SQL注入是一种常见的网络攻击手段,攻击者通过在Web应用程序的查询字符串参数或表单输入字段中插入恶意SQL代码,来操纵数据库查询的方式,从而非法访问...

    如何防止SQL注入.pdf

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

    有效防止SQL注入的5种方法总结

    以下是对防止SQL注入的五种方法的详细说明: 1. 使用参数化查询(PreparedStatement) 参数化查询是预防SQL注入最有效的方法之一。在Java中,可以使用PreparedStatement对象来执行预编译的SQL语句。预编译的SQL...

    防止sql注入

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

    预加载防止sql注入

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

    java防止sql注入.pdf

    6. **安全的参数化查询**:虽然此示例没有直接展示,但在实际应用中,预防SQL注入的最佳实践是使用预编译的SQL语句,如Java的`PreparedStatement`,它可以自动处理字符串转义,有效地防止SQL注入。 7. **输入长度...

Global site tag (gtag.js) - Google Analytics