我以 sysdba 身份连接到 oracle 并运行它
但是为什么在使用调用者权限调用时它会失败?那是 p_user 调用。
这是代码:
alter session set current_schema=x;
CREATE or replace package p_definer as
procedure d(name_ varchar2);
end;
/
CREATE or replace package p_user authid current_user as
procedure d(name_ varchar2);
end;
/
CREATE or replace package body p_definer as
procedure d(name_ varchar2) as
begin
execute immediate 'drop procedure '||name_;
end;
end;
/
CREATE or replace package body p_user as
procedure d(name_ varchar2) as
begin
execute immediate 'drop procedure '||name_;
end;
end;
/
create or replace procedure f_foo as
BEGIN
dbms_output.put_line('hello world');
END;
/
Run Code Online (Sandbox Code Playgroud)
这是电话
SQL> call p_user.d('f_foo');
call p_user.d('f_foo')
*
ERROR at line 1:
ORA-06598: insufficient INHERIT PRIVILEGES privilege
ORA-06512: at "G_GS.P_USER", line 2
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用?
SQL>
SQL> call p_definer.d('f_foo');
Call completed.
Run Code Online (Sandbox Code Playgroud)
因为这是一个新的 12c 安全功能。
用户 x 创建了一个无害的包,每个人都开始使用它,即使是具有更高权限的用户,如 SYS。
现在用户 x 知道 SYS 经常使用这个包,所以用户 x 可以随时用一些恶意代码替换这个包的内容,并在数据库中做任何事情,知道这些代码迟早会被 SYS 运行。
12c 通过这个新功能防止了这种情况:
但如果 SYS 信任 x,则可以执行以下操作:
grant inherit privileges on user sys to x;
Run Code Online (Sandbox Code Playgroud)
这将允许 x 在运行上述代码时继承 SYS 的权限。