Форум OlegON > Компьютеры и Программное обеспечение > Операционные системы и программное обеспечение > Oracle

Анти-DDOS, блокировка входящих сессий от пользователя при превышении их количества : Oracle

23.04.2024 21:49


22.03.2013 20:27
OlegON
 
В примере ниже, если пользователь без роли DBA и не SUPERMAG или SYS (чтобы в алерт не сыпалось), ему блокируют вход при наличии уже 8 сессий от этого пользователя в базе. Про профили прошу не намекать. Мне это не подходило по ряду причин. Кому-то, возможно, выгоднее их использовать.

Код:
CREATE OR REPLACE TRIGGER BLOCK_DDOS         
AFTER LOGON ON DATABASE                                        
DECLARE                                                                                                                                                        
CNT NUMBER(10);                                                                                                                                                
BEGIN                                                                                                                                                          
SELECT COUNT(username) INTO cnt FROM sys.v$session WHERE username=SYS_CONTEXT('userenv','session_user') AND username !='SUPERMAG' AND username!='SYS';         
IF (cnt > 8) THEN                                                                                                                                              
RAISE_APPLICATION_ERROR(-20000, 'Nigga died!');                                                                                                                
END IF;                                                                                                                                                        
END;
08.10.2013 11:37
OlegON
 
Код:
create or replace procedure disconnect_1C is
begin
for c in (SELECT * FROM ( SELECT /*+ FIRST_ROWS(n) */ a.*, ROWNUM rnum FROM (select sid,serial# from v$session where username='USERFOR1C' order by logon_time) a) WHERE rnum  >= 4)
loop
begin
execute immediate
'alter system disconnect session ''' || c.sid || ',' || c.serial# || ''' immediate';
exception when others then null;
end;
end loop;
end;
/

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'kill_1C',
job_type => 'PLSQL_BLOCK',
job_action => '
begin 
disconnect_1C;
disconnect_1C;
exception when others then null; 
end;
',
repeat_interval => 'FREQ=SECONDLY; INTERVAL=30;',
enabled => TRUE
);
END;
/
вот через профиль
Код:
create profile one_session limit sessions_per_user 1;
alter user ras_supermag profile one_session;
Часовой пояс GMT +3, время: 21:49.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.