千家信息网

2011-12-01 SQL注入的防备

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,http://www.itpub.net/thread-1499223-21-1.html207楼我创建如下的两张表并填入数据:CREATE TABLE plch_names1 (name VARCH
千家信息网最后更新 2026年11月02日2011-12-01 SQL注入的防备

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_REFCURSORIS   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: 表名不可以用绑定变量。
名字 数据 函数 引号 答案 参数 变量 字母 字符 成员 过程 宽松 安全 不幸 之间 乐队 代码 实例 小数 小数点 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 疫情对互联网科技公司影响 科技企业和互联网企业 互联网女皇 腾讯科技 镁科技互联网资讯平台 丰台科技园 互联网公司 互联网之后的科技是什么 广州慧亚互联网科技怎么样 昭通云南众福互联网科技有限公司 互联网企业和科技型企业 互联网金融中的现代科技 互联网对科技的发展 互联网金融科技展 允成互联网科技有限公司融资 科技大学互联网 互联网第三次科技革命特征 云南省自由互联网科技有限公司 互联网风格科技公司名称 数字互联网科技有限公司 互联网的科技体现在哪里 保山浩联互联网科技有限公司 广州为想互联网科技有限公司 云信互联网科技有限公司 狮子座互联网科技 碳银互联网科技 互联网科技的英文 卫星互联网科技股票 中国互联网有什么科技 江苏互联网科技小贷 互联网金融运营模式中的金融科技 广州全民伙伴互联网科技有限公司
0