Форум по программному обеспечению и оборудованию > > >

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

08.12.2016 5:09


[ОТВЕТИТЬ]
Опции темы
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, время: 05:09.

Все в прочитанное - Календарь - RSS - - Карта - Вверх 👫 Яндекс.Метрика
Форум сделан на основе vBulletin®
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.