我有一个软件包,用于创建新用户,新用户的新密码和更改现有用户的密码,并给予用户授予用户角色。
包中的函数接受用户的输入并检查用户表。如果现有用户更改密码,如果新用户创建新用户。
函数如下:在所有过程中,fp_userid
直接连接在dbms_sql.parse
语句中。我尝试了execute immediate,但我仍然必须连接值。我想我们不能绑定价值观。
我们可以绑定ddl,dcl语句的值吗?或者我们可以清理用户输入以避免SQL注入吗?在这种情况下如何使用dbms_assert
包?
Function fn_userexists(fp_userid IN varchar2)
return boolean
is
cursor c is
select userid, password,userrole,deleted from user_db where userid = fp_userid
r_user c%rowtype;
begin
open c;
fetch c into r_user;
if c%notfound then
return false;
else if r_user.deleted = 'Y' then
if fn_oracleuserexists (fp_user) then
pr_dropuser (fp_user);
end if;
close c;
delete user_db where userid = fb_userid;
return false;
elsif not fn_oracleuserexists (fp_user) then
pr_createuser(fp_userid, fn_hid(r_user.password,fp_userid));
pr_grantuserrole(fp_userid, 'SMC_USER');
pr_grantuserrole(fp_userid, r_user.userrole);
return true;
end if;
return true;
end if;
return true;
end if;
exception
when other then
return false;
end;
字符串
我尝试使用execute immediate语句,但值仍然是连接的,如下所示,并在检查标记扫描中显示SQL注入漏洞。
execute immediate 'CREATE USER "'||pp_userid||'" IDENTIFIED BY "' || pp_password'"
DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP';
型
1条答案
按热度按时间p1tboqfb1#
您发布的代码无法编译,它无效,因为
end if
(如果你正确格式化代码,这将更容易发现)无论如何:下一次,考虑发布一些至少第一眼看起来还可以的东西。至于其他问题,请尝试在代码末尾从函数中使用单个
return
。此外,您处理异常的方式很可能是错误的。如果发生任何情况,函数返回false
,但你不知道这是因为游标返回 nothing 还是因为错误。直到你弄清楚并决定如何正确地处理异常(记录它们?给自己发邮件?返回不同的数据类型?其他的东西),你宁愿让Oracle引发一个错误。这是你的代码,修复了-看看是否有帮助。
字符串