2011-12-01 SQL注入的防备
发表于:2025-01-29 作者:千家信息网编辑
千家信息网最后更新 2025年01月29日,http://www.itpub.net/thread-1499223-21-1.html207楼我创建如下的两张表并填入数据:CREATE TABLE plch_names1 (name VARCH
千家信息网最后更新 2025年01月29日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安全错误
数据库的锁怎样保障安全
湖北工程学院网络安全专业
软件开发中 产品和项目
临沂用友软件开发公司地址
软件开发类论文目录
软件开发成本结转会计分录
什么是计算机网络安全6
前锦网络技术有限公司是外包吗
凯度网络技术
申通网络技术有限公司
怎么使用网络技术
节点网络技术
下列关于网络安全理解
丹尼尔斯nba数据库
软件开发哪个城市就业前景好
公安厅 网络安全培训
数据库的选取
一级网络安全素养题目
跟谁学软件开发需要什么
织梦怎么更改数据库密码
acs数据库下载
网络安全例行检查制度
数据库和归档的区别
aparch服务器
录制网络安全精品课程
计算机网络技术的人多吗
南阳理工学院智能软件开发专业
比对两个表格的数据库
运营商网络安全形势
网络安全教育个人心得体会
互联网公司都是伪高科技