我想能够阻止一个只读数据库用户访问一些系统函数,例如sys_context。
SELECT sys_context('USERENV', 'SID') FROM DUAL;
SELECT SYS.DATABASE_NAME FROM dual;
SELECT dbms_utility.port_string FROM dual;
*编辑:通过这里提供的回复和我这边尝试的其他事情,向biz提供了一份冗长的报告。他们认为试图限制这些权限不值得冒险,因此放弃了。
我没有找到一种方法来防止访问 SYS_CONTEXT
但你可以防止访问 DATABASE_NAME
和 DBMS_UTILITY
:
REVOKE EXECUTE ON SYS.DBMS_UTILITY FROM PUBLIC;
REVOKE EXECUTE ON SYS.DATABASE_NAME FROM PUBLIC;
然而,Oracle在Support Document Doc ID 247093.1中非常强烈地警告要撤销任何来自PUBLIC的特权。基本上,如果你这样做,他们将不支持你的应用程序,你要靠自己。
找出会话号(SID)有什么问题?每次你连接时它都会改变...
我个人认为,把数据库名称视为安全风险是完全愚蠢的。你的pentesters抱怨的功能几十年来都是可以被public访问的。让我想起了《格林姆斯童话》中,一旦磨坊主的女儿猜出他的名字 "Rumpelstiltskin",妖精就会死去......