oracle 执行触发器期间跳过错误

kiz8lqtg  于 2023-11-17  发布在  Oracle
关注(0)|答案(2)|浏览(194)

我在数据库事件LOGON上创建了一个触发器,防止没有权限的人错误的登录到数据库。当主机名以C开头时,需要拒绝连接。

CREATE OR REPLACE TRIGGER "SYS"."LOGIN_RJ" AFTER LOGON ON DATABASE
DECLARE
HOST_NAME VARCHAR2(128):=SYS_CONTEXT('USERENV','HOST');
BEGIN
if (HOST_NAME like 'C%') then
    raise_application_error(-20000,'host login denied');
end if;
END;

字符串
它对大多数用户帐户都很有用,但特定用户仍然可以登录数据库而不会出现任何ORA错误。
1.当用户成功登录数据库时,我发现数据库生成了如上的警报日志:

> Skipped error 604 during the execution of SYS.LOGIN_RJ
> 
> dbkedDefDump(): Starting a non-incident diagnostic dump (flags=0x0, level=0, mask=0x0)
> Error Stack Dump -----
> ORA-00604: error occurred at recursive SQL level 1
> ORA-20000: host login denied
> ORA-06512: at line 6


1.我尝试授予/撤销角色,发现DBA或IMP_FULL_DATABASE角色会影响上述触发器。当用户被授予IMP_FULL_DATABASE角色时,触发器不会引发应用程序错误。
是否有其他方法可以在不撤销角色权限(IMP_FULL_DATABASE或DBA)的情况下限制用户登录?

qni6mghb

qni6mghb1#

通过在登录触发器中引发ORA-600错误,可以阻止管理帐户登录Oracle数据库:

CREATE OR REPLACE TRIGGER SYS.LOGIN_RJ AFTER LOGON ON DATABASE
DECLARE
  --Only an ORA-600 error can stop logons for users with either
  --"ADMINISTER DATABASE TRIGGER" or "ALTER ANY TRIGGER".
  --The ORA-600 also generates an alert log entry and may warn an admin.
  INTERNAL_EXCEPTION EXCEPTION;
  PRAGMA EXCEPTION_INIT( INTERNAL_EXCEPTION, -600 );

  HOST_NAME VARCHAR2(128):= SYS_CONTEXT('USERENV','HOST');
BEGIN
  IF HOST_NAME LIKE 'C%' THEN
    RAISE INTERNAL_EXCEPTION;
  END IF;
END;
/

字符串
我不知道
使用此解决方案时要非常小心,原因如下:
1.您永远不希望出现阻止所有管理员登录的情况。

  1. ORA-600错误是会生成跟踪文件的资源密集型错误。您的数据库可能会受到监控,以便自动报告此类错误。此解决方案可能会向DBA发送垃圾邮件。在最坏的情况下,如果自动化系统触发此错误一千次,您的操作系统可能会在意想不到的地方增长并创建拒绝服务攻击。在实施此触发器之前,请与DBA讨论。
  2. HOST变量可以被欺骗,因为Oracle必须依赖第三方数据库连接器来提供此信息。根据您的JDBC软件,应用程序可能会更改其主机名。实际上,没有多少人会这样做,但欺骗的能力意味着您的解决方案不是100%防弹的。
    我以前用过这样的代码,它可以工作并且很有用。但是你应该意识到它的局限性,如果有更好的安全机制的话,就使用它。
5n0oy7gb

5n0oy7gb2#

正如上面的注解中所提到的,DBA不能(编辑:通常)被阻止使用登录触发器错误进行连接。
如果您需要阻止某些主机名连接,编辑防火墙规则是最强大的选项。Oracle还提供了有限的选项,可以使用sqlnet.ora配置参数阻止防火墙中的IP和主机名。

相关问题