oracle 如何清理用户输入并在ddl和dcl命令中使用以避免SQL注入

unguejic  于 2023-08-03  发布在  Oracle
关注(0)|答案(1)|浏览(106)

我有一个软件包,用于创建新用户,新用户的新密码和更改现有用户的密码,并给予用户授予用户角色。
包中的函数接受用户的输入并检查用户表。如果现有用户更改密码,如果新用户创建新用户。
函数如下:在所有过程中,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';

p1tboqfb

p1tboqfb1#

您发布的代码无法编译,它无效,因为

  • 参数名拼写错误(fB_userid,fp_user)
  • 游标声明中缺少终止分号
  • 多余的end if(如果你正确格式化代码,这将更容易发现)

无论如何:下一次,考虑发布一些至少第一眼看起来还可以的东西。至于其他问题,请尝试在代码末尾从函数中使用单个return。此外,您处理异常的方式很可能是错误的。如果发生任何情况,函数返回false,但你不知道这是因为游标返回 nothing 还是因为错误。直到你弄清楚并决定如何正确地处理异常(记录它们?给自己发邮件?返回不同的数据类型?其他的东西),你宁愿让Oracle引发一个错误。
这是你的代码,修复了-看看是否有帮助。

Function fn_userexists(fp_userid IN varchar2)
  return boolean
is
  l_userid varchar2(100) := dbms_assert.enquote_name(fp_userid);

  cursor c is 
     select userid, password,userrole,deleted 
       from user_db 
       where userid = l_userid;
  r_user c%rowtype;
  result number;
begin
  open c;
  fetch c into r_user;
  if c%notfound then
     result := 0;
  else 
    if r_user.deleted = 'Y' then
       if fn_oracleuserexists (l_userid) then
          pr_dropuser (l_userid);
       end if;
       delete user_db where userid = l_userid;
       result := 0;

    elsif not fn_oracleuserexists (l_userid) then
       pr_createuser(l_userid, fn_hid(r_user.password,l_userid));
       pr_grantuserrole(l_userid, 'SMC_USER');
       pr_grantuserrole(l_userid, r_user.userrole);
       result := 1;
    end if;
  end if;

  close c;
  return result = 1;
end;

字符串

相关问题