广告
返回顶部
首页 > 资讯 > 数据库 >2011-12-01 SQL注入的防备
  • 534
分享到

2011-12-01 SQL注入的防备

2024-04-02 19:04:59 534人浏览 八月长安
摘要

Http://www.itpub.net/thread-1499223-21-1.html 207楼 我创建如下的两张表并填入数据: CREATE TABLE plch_name

Http://www.itpub.net/thread-1499223-21-1.html

207楼

我创建如下的两张表并填入数据:

CREATE TABLE plch_names1 (name VARCHAR2 (100))
/
CREATE TABLE plch_names2 (name VARCHAR2 (100))
/
BEGIN
   INSERT INTO plch_names1 VALUES ('Paul');
   INSERT INTO plch_names1 VALUES ('RinGo');
   INSERT INTO plch_names1 VALUES ('John');
   INSERT INTO plch_names1 VALUES ('George');
   INSERT INTO plch_names2 VALUES ('Jerry');
   INSERT INTO plch_names2 VALUES ('Bob');
   INSERT INTO plch_names2 VALUES ('Phil');
   COMMIT;
END;
/

然后我创建了这个函数来返回一个游标,里面包含了指定表名的name列的数据:

CREATE OR REPLACE FUNCTioN plch_get_names (table_in IN VARCHAR2)
   RETURN SYS_REFCURSOR
IS
   l_cv   SYS_REFCURSOR;
BEGIN
   OPEN l_cv FOR 'select name from ' || table_in || ' order by name';
   RETURN l_cv;
END plch_get_names;
/

这里是一个“帮手”过程来显示这个函数所返回的数据:

CREATE OR REPLACE PROCEDURE plch_show_names (table_in IN VARCHAR2)
IS
   l_cv     SYS_REFCURSOR;
   l_name   plch_names1.name%TYPE;
BEGIN
   DBMS_OUTPUT.put_line ('Names in ' || table_in);
   l_cv := plch_get_names (table_in);
   LOOP
      FETCH l_cv INTO l_name;
      EXIT WHEN l_cv%NOTFOUND;
      DBMS_OUTPUT.put_line (l_name);
   END LOOP;
   CLOSE l_cv;
END plch_show_names;
/

当我执行下列这个代码块,我可以看到Beatles 和 Grateful Dead乐队的成员。(即上述两张表中的数据)

BEGIN
   plch_show_names ('plch_names1');
   plch_show_names ('plch_names2');
END;
/

不幸的是,如果我这样来执行:

BEGIN
   plch_show_names (
      'plch_names2 where 1=2 uNIOn select username from all_users --');
END;
/

我看到了数据库实例中所有用户的名字,这属于安全违规(是一种sql注入)

下面哪些plch_get_names函数会抛出异常,假如调用时传入了那个“注入”参数值,但是如果传入像plch_names1 和 plch_names2这样的“真实”表名你还可以看到表中数据?

(A)

BEGIN
   OPEN l_cv FOR
         'select name from '
      || DBMS_ASSERT.simple_sql_name (table_in)
      || ' order by name';
   RETURN l_cv;
END plch_get_names;

(B)

BEGIN
   DBMS_ASSERT.simple_sql_name (table_in);
   OPEN l_cv FOR 'select name from ' || table_in || ' order by name';
   RETURN l_cv;
END plch_get_names;

(C)

BEGIN
   OPEN l_cv FOR
         'select name from '
      || DBMS_ASSERT.qualified_sql_name (table_in)
      || ' order by name';
   RETURN l_cv;
END plch_get_names;

(D)

BEGIN
   OPEN l_cv FOR 'select name from :table_name order by name' USING table_in;
   RETURN l_cv;
END plch_get_names;

答案说明在209楼

2011-12-01答案AC.
DBMS_ASSERT.SIMPLE_SQL_NAME检查一个名字是否为SQL中可用的简单名字:
  名字必须以字母开头,随后可跟随数字、字母或_, $, # 字符;
  允许带双引号,双引号之间可以是任意字符;
  假如双引号之内的名字本身就带有双引号,那么必须重复双引号两次来表示;
  输入参数如果前后带有空格被忽略。
  名字的长度没有被检测。
DBMS_ASSERT.qualified_sql_name则更宽松一些,允许带.(小数点,比如用在记录成员、PACKAGE里面的函数、SCHEMA OWNER等)和@ (用在DBLINK)
答案B: simple_sql_name是函数不是存储过程,必须将返回值赋给变量。
答案D: 表名不可以用绑定变量。
您可能感兴趣的文档:

--结束END--

本文标题: 2011-12-01 SQL注入的防备

本文链接: https://www.lsjlt.com/news/48272.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • sql中的char是什么意思
    char 是 sql 中的字符字符串类型,具有固定长度,无论存储实际字符的数量,都会填充到指定长度。它用于存储特定长度的数据,确保对齐和防止数据不一致。 CHAR 在 SQL 中的含义...
    99+
    2024-05-09
  • sql中char(3什么意思
    char(3) 是 sql 中一种长度修饰符,创建具有固定长度的字符数据类型,始终存储 3 个字符,使用空格填充或截断超出长度的数据,以提高性能但可能效率较低。 CHA...
    99+
    2024-05-09
  • sql中如何进行拼接
    sql 中可使用多种方法进行字符串拼接,包括使用连接运算符 (+)、concat 函数、|| 运算符(oracle 和 mysql)、format 函数(sql server)和 stu...
    99+
    2024-05-09
    mysql oracle
  • mysql中浮点数类型包括字符串吗
    否,mysql 中的浮点数类型不包含字符串。浮点数类型(float、double)存储近似值,以二进制值表示。用于存储字符串的类型包括 varchar、char 和 text,以字符形式...
    99+
    2024-05-09
    mysql
  • sql中拼接字段的函数有哪些
    sql 提供了多种拼接字段的函数,包括 concat()、|| 操作符和 format()。concat() 函数连接多个字符串,|| 操作符也具有相同功能,form...
    99+
    2024-05-09
  • sql中rownumber和rank区别
    row_number 和 rank 都是用于对 sql 结果集排序和编号的函数。row_number 按插入顺序为行分配连续整数,而 rank 为具有相同值的行分配相同的排名,并重新编号...
    99+
    2024-05-09
  • sql中的sum函数的用法
    sql 中 sum 函数计算指定列非空值之和。其语法为 sum(expression),其中 expression 为要计算的列或表达式。sum 函数可用于计算总和、汇总数据,并适用于财...
    99+
    2024-05-09
    库存管理
  • sql中的sum底层是怎么实现的
    sql 中 sum 的底层实现原理包括:准备阶段:分配内存缓冲区、获取符合条件的行。累加阶段:将每一行的列值添加到累加器(内存变量)中。优化阶段:使用数据结构优化遍历,跳过特殊值。结果阶...
    99+
    2024-05-09
  • sql中的sum是如何运算的
    sql sum 函数通过将一组数字相加来计算它们的总和。其运算过程包括:1. 识别输入值;2. 循环输入值并将其转换为数字;3. 对每个数字进行加法,累积一个总和;4. 返回总和结果。 ...
    99+
    2024-05-09
    聚合函数
  • sql中的sum是什么意思
    sql中的sum函数是用于计算指定列中非空值的和的聚合函数,它可以通过sum(column_name)的语法使用。通过汇总大量数据,识别趋势和进行比较,sum函数简化了数据分析并提供了有...
    99+
    2024-05-09
    聚合函数
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作