2011-12-01 SQL注入的防备
发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,http://www.itpub.net/thread-1499223-21-1.html207楼我创建如下的两张表并填入数据:CREATE TABLE plch_names1 (name VARCH
千家信息网最后更新 2025年11月09日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安全错误
数据库的锁怎样保障安全
魔兽公共服务器
雅乐经典影院数据库辽宁图书馆
怎样更换网络安全类型
吉林智慧医养软件开发电话
阜阳飞扬网络技术公司
佛山信息软件开发公司
数据库管理系统常用的三个模型
wwin10服务器管理器在
软件开发二三事
部队坚守网络安全底线
服务器要安装哪些安全软件
互联网科技发展高歌猛进
对公司的软件开发流程图
明日方舟哪个服务器最好
软件开发工具放在什么盘
网络安全技术教学计划
档案员网络安全
卡莱特服务器名称
本地文件替换服务器文件
网络安全通知怎么下
导入数据库忽略错误
庞国芳食药农残数据库
靖江小型网络技术价格表格
软件开发二三事
俊波网络技术
丹东华美软件开发
盘锦总部生态园有软件开发吗
服务器运行多少分钟后断网
江苏好的软件开发技术指导
网络安全泄漏事故不可避免