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

读《Oracle编程艺术》有感之一有关SQL注入与绑定变量

阅读更多
Oracle Database 9i/10g/11g编程艺术 深入数据库体系结构第2版 写道
SQL注入是一个安全漏洞,如果开发人员接受来自最终用户的输入,把这个输入拼接到查询中,然后编译和执行这个查询,就会存在这种安全漏洞。实际上,开发人员可能会接受来自最终用户的SQL代码段,然后编译和执行这些代码段。利用这种方法,最终用户就有可能修改SQL语句,做一些应用开发人员原来不打算做的事情。这就像是你打开终端,登陆一个SQLPlus会话并作为SYSDBA连接。你希望有人来键入某个命令,然后编译并执行这个命令。结果将是灾难性的。

      所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。根据《Oracle编程艺术》上面的引用,简单地说,SQL注入就是通过传入特定参数,然后把这个参数以SQL段形式拼接之后编译执行,重点是SQL “拼接”!

     为了说明SQL注入攻击的危险性,《Oracle Database 编程艺术》举了一个例子,下面我们主要是一个更简单的例子去感受一下SQL注入的危险性。

 

SELECT STUNO, STNAME FROM STUDENT T
WHERE T.CREATE_DATE = 

     假如我们的程序从学生信息表里读学生学号和姓名信息,通过传入的入学日期(创建日期)参数返回指定学生的信息。

     当我们程序使用的是拼接的模式,例如:

DBMS_OUTPUT.PUT_LINE('
     SELECT STUNO, STNAME FROM STUDENT T
     WHERE T.CREATE_DATE =' || P_CREATE_DATE );

     把传入参数直接拼接到SQL语句,然后编译执行。

     当 CREATE_DATE 为 VARCHAR 类型,例如存储的格式是'YYYY-MM-DD'这样的字符串格式,有了解过SQL注入的童鞋们一眼就可以看出这个语句灰常容易遭到SQL注入攻击。

     在这里,为了说明问题,我们再引入一个表 T_PASSWORD, 存放的是机密的用户密码信息等,当然,我们不想向所有人展示这个表的数据,更甚至的我们不希望那些不必要的人知道有这么一个表。但是,黑客(或者一些恶意的开发人员)可以在上面这个段SQL段利用SQL注入可以读取得到这个表数据。

    

    首先,恶意的开发人员或者用户并不知道有这个表,但是他们可以通过传入的参数 P_CREATE_DATE 等于

'' UNION ALL SELECT '', T.OWNER||'.'||T.TABLE_NAME FROM ALL_TABLES T

    这样,那些坏蛋们就可以通过前台我们开发人员提供的这么一个参数端口查看到我们库的库表信息。T_PASSWORD表的存在当然也就暴露咯~

   

    也许,你会说,他们不知道我们的T_PASSWORD有什么字段。是的,他们现在还不知道,但是,他们下一步就会知道了。他们知道了T_PASSWORD表之后,想要了解这个表的字段,一样可以通过传入参数 P_CREATE_DATE 等于

'' UNION ALL SELECT '' , T.COLUMN_NAME ||'.'||T.DATA_TYPE FROM ALL_TAB_COLS T
                    WHERE T.OWNER = ... AND T.TABLE_NAME = ...

   

    到了这里,你也知道他们可以可以查看 T_PASSWORD 表数据了吧。

 

    上面是假设 CREATE_DATE 为 VARCHAR 类型的字段,这里只是一个假设,并不是一个限制!也许有人会问,不是VARCHAR类型的字段,传入的参数不就是不合法了吗?这样不就可以避免了SQL注入攻击了吗?其实,不然。我们可以拿 CREATE_DATE 为 DATE 类型继续说明一下,即使像 DATE 这样的7字节二进制格式也没有办法避免拼接SQL语句受到SQL注入的攻击。

Oracle Database 9i/10g/11g编程艺术 深入数据库体系结构第2版 写道
目前,我认识的大多数开发人员查看代码后都会说:这个代码不会受到SQL注入攻击。他们还会解释说,这是因为这个例程的输入必须是一个ORACLE DATE变量, DATE 是一个表示世纪、年、月、日、时、分和秒的7字节二进制格式。他们认为DATE变量根本没办法改变SQL语句的含义。但事实上,他们都错了!这个代码确实可以“被注入”,有办法的人(显然,确实有很多人知道怎么做)能轻轻松松地再运行时作出修改。

    例如恶意的开发人员或用户只需执行下面代码就可以了:

ALTER SESSION SET
    NLS_DATE_FORMAT = ' '' ' ' UNION SELECT TNAME,0,NULL FROM TAB-- '' ';

 

Oracle Database 9i/10g/11g编程艺术 深入数据库体系结构第2版 写道
这个 NLS_DATE_FORMAT 很有意思,大多数人甚至不知道可以用 NLS_DATE_FORMAT 包含字符串字面量。(另外,很多人还不知道即使不使用 NLS_DATE_FORMAT 这个“技巧”,也可以像这样改变日期格式。)

    事实证明, 通过 NLS_DATE_FORMAT 的设置,类似上面的方法,也是可以进行SQL注入的!

 

(注:上面提到的改变日期格式,本人还没有去了解过。后面有时间去研究研究

 

 

 

 

     那么,我们如何保护自己呢?最直接的办法就是使用绑定变量。

OPEN C_CURSOR FOR 
' SELECT STUNO, STNAME FROM STUDENT T
  WHERE T.CREATE_DATE = :P_CREATE_DATE '  USING P_DATE

 

    使用绑定变量,就不会遭遇SQL注入攻击。 其实,绑定变量还能提升程序的运行速度,但是本文旨在提到SQL注入攻击的思想,了解这个黑客常用的手段以及防范方法,其他的不在本文讨论的范围之内,所以就不在此做过多的描述了。

 

分享到:
评论
1 楼 sea0108 2011-12-06  
向龙哥致敬!你的博文是我永远关注的目标!
Happiness only when shared.

相关推荐

    动态SQL与绑定变量

    动态SQL与绑定变量是数据库编程中的重要概念,尤其在Oracle数据库中被广泛应用。动态SQL允许在运行时构建和执行SQL语句,而绑定变量则是在动态SQL中用于替代具体值的占位符,使得SQL语句更为灵活和高效。 ### 1. ...

    oracle 数据库的绑定变量特性及应用

    绑定变量是 Oracle 数据库的一种特性,它旨在提高数据库系统的性能和可扩展性。在本文中,我们将详细地探讨绑定变量的目的、命名方法、使用限制条件和应用实例。 为什么使用绑定变量? 绑定变量是解决 Oracle 应用...

    浅谈oracle 数据库的绑定变量特性及应用

    - **动态SQL**:在编程语言如Java、Python等与Oracle数据库交互时,经常使用预编译的PreparedStatement,其中就包含了绑定变量的概念。 - **PL/SQL块**:在Oracle的存储过程、函数和触发器中,也可以使用绑定变量...

    在Java中实现Oracle变量的绑定方法 .doc

    在Java中实现Oracle变量的绑定方法,主要是为了优化SQL语句的执行效率,减少数据库解析负担,提升系统性能。Oracle数据库在处理SQL语句时,会先进行解析,然后将解析后的SQL语句存储在共享池(Shared Pool)中。如果...

    sql绑定变量

    标题与描述中的“SQL绑定变量”这一知识点,主要聚焦于SQL语句中如何使用变量,尤其是在存储过程或函数中动态构建SQL语句时的关键技术。绑定变量允许在SQL语句中使用程序变量作为参数,这不仅提高了代码的可读性和...

    也谈oracle 数据库的绑定变量特性及应用

    Oracle 数据库的绑定变量特性是其优化性能的关键技术之一,主要应用于提高数据库应用程序的可伸缩性和效率。绑定变量允许开发者创建动态SQL语句,其中的变量在执行时才提供具体的值,而不是硬编码到查询中。这种做法...

    查找未使用绑定变量sql.sql

    查找未使用绑定变量sql.sql

    Java中Oracle操作绑定变量使用用户工具模块解决方案

    在Java开发过程中,特别是与Oracle数据库交互的应用场景中,SQL语句的编写及执行效率一直是开发者关注的重点之一。为了提高SQL语句的执行效率,减少不必要的资源消耗,推荐使用绑定变量(即`PreparedStatement`)...

    Oracle_SQL注入

    **Oracle SQL注入**是一种针对使用Oracle数据库的应用程序的安全攻击手段。攻击者通过构造特殊的SQL查询来操纵目标应用程序中的SQL语句,以此来获取敏感数据、修改数据或执行任意代码等。在本篇文章中,我们将详细...

    Oracle SQL高级编程

    提供的【部分内容】部分并不是具体的Oracle SQL编程知识点,而是一个重复的网址:“Download at ***”。这可能是一个下载链接,但没有更多上下文信息,我们无法确定该链接所指向的具体内容。 需要注意的是,给出的...

    oracle编程艺术代码

    Oracle编程艺术涵盖了SQL、PL/SQL、数据库设计与优化等多个方面。通过源码,我们可以学习到: 1. SQL编程:高级查询技巧,如联接、子查询、集合操作、窗口函数等,以及如何编写高效的SQL语句。 2. PL/SQL:Oracle的...

    Oracle 中的变量绑定

    Oracle中的变量绑定是一种重要的数据库操作优化技术,尤其在处理大量重复SQL语句时,它可以显著提升系统的性能。本文将深入探讨变量绑定的概念、工作原理及其在Java编程中的应用。 首先,变量绑定指的是在SQL语句中...

    Oracle编程艺术

    《Oracle编程艺术》一书是针对Oracle数据库系统编程的一份宝贵资源,主要涵盖了与Oracle相关的各种编程技术和实践经验。Oracle作为世界上最广泛使用的数据库管理系统之一,其编程艺术涉及了SQL查询、PL/SQL编程、...

    如何解决sql注入问题

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

    Oracle编程艺术++深入理解数据库体系结构+第三版

    深入理解Oracle数据库体系结构,大师之作,推荐阅读。

    Oracle SQL注入技术

    包含三个pdf文件: 1、JSP+Oracle的SQL注入 .pdf 2、Oracle SQL注入.pdf(讲解dbms包的非法使用过程) 3、Oracle数据库中SQL注入攻击的检测与防御.pdf(一篇学术性文章)

    Oracle四大宝典之一:Oracle Sql基础 中文版

    SQL是你和数据库交换的关键。掌握这个对于使用数据库来说是非常重要的。掌握SQL,对于数据库管理员以及数据库工程师来说,它犹如古代剑客手中的剑,现在士兵手中的枪一样绝对是不可或缺的。...第十三章 SQL与SQL*Plus

    精通 ORACLE SQL高级编程 学习笔记

    精通Oracle SQL【第2版】ORACLE SQL高级编程【第二版】学习笔记

    Oracle开发人员SQL注入攻击入门

    - **参数化查询/预编译语句**:使用绑定变量可以防止SQL注入,因为它们将用户输入与SQL语句逻辑分离。 - **输入验证和清理**:对所有用户输入进行严格的验证,并清理掉潜在的恶意字符。 - **限制数据库权限**:应用...

    oracle编程艺术

    《Oracle编程艺术》是Oracle全球顶级专家Tom的作品,这本书深入浅出地揭示了Oracle数据库的体系结构和工作原理,被誉为理解Oracle技术的宝典。Tom以其丰富的经验和深厚的理论基础,为读者提供了一条通向Oracle编程...

Global site tag (gtag.js) - Google Analytics