2011-12-01 SQL注入的防备
发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,http://www.itpub.net/thread-1499223-21-1.html207楼我创建如下的两张表并填入数据:CREATE TABLE plch_names1 (name VARCH
千家信息网最后更新 2024年11月11日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安全错误
数据库的锁怎样保障安全
江岸软件开发电话
导轨 服务器
第三方软件开发收费报价表
网络安全模拟主持词
我们网络安全形势
数据库分库技术
武汉app软件开发解决方案
升级ios 无服务器
数据库联合主键有什么用
移动互联网科技股票
毕业论文初稿数据库是什么
如何进行b s软件开发
医疗器械软件开发招聘
access数据库如何破解
浙江项目软件开发哪家可靠
db2数据库用法
网络安全法 贩卖个人信息
数据库后台管理密码怎么查看
石油网络安全股票有哪些
数据库统计成绩表的平均分
软件开发专业大专排名
专科智能互联网络技术
服务器控制电脑和普通电脑的区别
内外网网络安全保密
2021上海6月网络安全
数据库的参数怎么导入
同花顺手机服务器ip是多少
db2数据库用法
excel分析数据软件开发
用友数据库链接