问题描述
我使用EXTPROC函数已经有一段时间了,但是最近遇到了一个用例,该用例要求人们根据调用Oracle用户的身份来确定EXTPROC调用是否应具有对外部资源的访问权限。
想到的第一件事是使用GRANTs来确定谁可以执行UDF或不执行,但这是非常粗糙的,它完全依赖于数据库配置,不允许您拒绝访问最终资源。本质上,这就像Oracle代表您提出请求。
在做一些基础研究时,我注意到有几个潜在的选择,但我似乎找不到很多关于它们的讨论:
-使用invoker权利条款AUTHID当前用户-不确定这是否真的增加了比授予已经增加的任何东西,因为它不会通知EXTPROC,所以我基本上已经在精神上消除了
-使用参数传递用户id或类似于EXTPROC-听起来不错,但是只需使用EXTPROC在查询中传递任何用户id即可轻松利用
-在EXTPROC中使用OCI (Oracle调用接口) 来拉出调用用户-似乎最有前途,但我正在努力确定实现将是什么样的 (C/Java示例)。
但可能还有其他更好的选择,我根本没有接触到。想法,甚至更好,例子?
想到的第一件事是使用GRANTs来确定谁可以执行UDF或不执行,但这是非常粗糙的,它完全依赖于数据库配置,不允许您拒绝访问最终资源。本质上,这就像Oracle代表您提出请求。
在做一些基础研究时,我注意到有几个潜在的选择,但我似乎找不到很多关于它们的讨论:
-使用invoker权利条款AUTHID当前用户-不确定这是否真的增加了比授予已经增加的任何东西,因为它不会通知EXTPROC,所以我基本上已经在精神上消除了
-使用参数传递用户id或类似于EXTPROC-听起来不错,但是只需使用EXTPROC在查询中传递任何用户id即可轻松利用
-在EXTPROC中使用OCI (Oracle调用接口) 来拉出调用用户-似乎最有前途,但我正在努力确定实现将是什么样的 (C/Java示例)。
但可能还有其他更好的选择,我根本没有接触到。想法,甚至更好,例子?
专家解答
我非常喜欢在一个地方定位安全规则,因为它降低了复杂性和违规风险。
当你说:
Using the PARAMETERS to pass in a user ID or similar to the EXTPROC - sounds great but this could easily be exploited by simply passing any user ID in a query using the EXTPROC
我会让标准数据库授权可以很容易地控制这一点。例如-这是我的 “外部” 程序
默认情况下,显然 * 否 * 其他用户可以调用此proc。我可以为此创建一个简单的包装器,将其锁定到某些用户。
当你说:
Using the PARAMETERS to pass in a user ID or similar to the EXTPROC - sounds great but this could easily be exploited by simply passing any user ID in a query using the EXTPROC
我会让标准数据库授权可以很容易地控制这一点。例如-这是我的 “外部” 程序
SQL> create or replace 2 procedure my_extproc(p_caller varchar2) is 3 begin 4 dbms_output.put_line(p_caller||' is using me'); 5 end; 6 / Procedure created.
默认情况下,显然 * 否 * 其他用户可以调用此proc。我可以为此创建一个简单的包装器,将其锁定到某些用户。
SQL> create or replace
2 procedure my_extproc_wrapper is
3 begin
4 my_extproc(user);
5 end;
6 /
Procedure created.
SQL>
SQL> grant execute on my_extproc_wrapper to scott;
Grant succeeded.
SQL> set serverout on
SQL> exec mcdonac.my_extproc('TRYING_USE_A_FAKE_ACCOUNT');
BEGIN mcdonac.my_extproc('TRYING_USE_A_FAKE_ACCOUNT'); END;
*
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00201: identifier 'MCDONAC.MY_EXTPROC' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
SQL> exec mcdonac.my_extproc_wrapper;
SCOTT is using me
PL/SQL procedure successfully completed.
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




