В последнее время большинство IRC сетей
подвергается атакам клон-ботов. Для того, чтобы нагнать трафик серверу и юзерам, сидящим на нем, злоумышленник управляет системой ботов (от десятки до тысячи экземпляров), которые джойнятся на определенный канал, создавая при этом огромный флуд.
Естественно, после этого пользователи перестают чатиться в Ирке (за трафик-то платят именно они), а админы закрывают сервера сетей. Это может привести к полному или частичному распаду IRC-сети.
Сегодня мы будем препятствовать этому беспорядочному флуду. На каждом уважающем себя канале (несмотря на наличие сервисов) обитает бот. Особой популярностью пользуются eggdrop'ы, в которых есть встроенный язык программирования (TCL), с помощью которого можно снабдить ламабота разными полезными скриптами.
Попробуем написать TCL скрипт, который будет устанавливать флаг +R на канал, когда произойдет join более 10 пользователей на канал в промежуток 20 секунд. Флаг +R запрещает заход на канал
не регистрированных ников (как раз такие используются флуд-ботами). Итак, приступим к выполнению поставленной задачи.
## AntiFlood Tcl script by Forb
set once 1 ## Установим значение начальной переменной (счетчик)
set mlock 0 ## Переменная флаг: установлен ли +R на канал?
set chann "#channel" ## Собственно, сам канал
foreach tms "[timers]" {
if {([llength $tms] != 0)} {
set tmc [lindex $tms 1]
set tid [lindex $tms 2]
if {($tmc == "unmode")} {
killtimer $tid
}
}
}
foreach tms "[utimers]" {
if {([llength $tms] != 0)} {
set tmc [lindex $tms 1]
set tid [lindex $tms 2]
if {($tmc == "strip")} {
killutimer $tid
}
}
}
## Данные процедуры убивают все таймеры при запуске (либо rehash'е скрипта). Это нужно для того, чтобы скрипт работал корректно при каждом перезапуске (иначе таймеры будут выполняться в 2 раза чаще).
utimer 20 strip ## Запускаем таймер на 20 секунд для обработки процедуры strip
timer 10 unmode ## И на каждые 10 минут - процедура для снятия режима +R
proc strip { } {
global once
set once 1
utimer 20 strip ## Процедура strip будет обнулять счетчик по истечению 20 секунд (чтобы не перепутать флуд с обычными заходами) и повторно активировать таймер
}
proc unmode { } { ## Данная процедура снимает +R по истечении 10 минут
global once chann mlock
if {($mlock == 1)} { ## Если режим установлен
putserv "MODE $chann -R"
set mlock 0 ## Снимаем его, и изменяем значение флага
}
timer 10 unmode ## Повторно активируем таймер
}
proc joined {nick uhost handle chan args } { ## Процедура, которая будет обрабатываться при каждом заходе ника (параметры ник, хост, хэндл в боте, канал и аргументы
global once chann mlock ## Глобализуем счетчик, канал и переменную-флаг
if {($chan == $chann)} {
incr once ## Инкрименируем счетчик, если канал совпадает с нужным
if {($once >= 10)} {
putchan $chann "Flood detected!" ## Если счетчик достиг 10 - пишем сообщение о детектировании флуда
putserv "MODE $chann +R" ## Устанавливаем +R
set mlock 1 ## И меняем значение флага на 1
}
}
}
bind join - *@* joined ## Устанавливаем bind на join (полную маску)
После изучения скрипта алгоритм его работы становится понятным. Как только происходит 10 заходов в 20 секунд - бот сразу выставит +R на канал. Если join'ов будет меньше, каждые 20 секунд скрипт будет вызывать процедуру strip, которая очистит счетчик заходов. Каждые 10 минут будет активироваться процедура unmode, в которой будет происходить снятие +R в случае, если режим установлен (не вечно же ему быть на канале).
Скрипт прекрасно интегрируется с другими AntiFlood скриптами, например со скриптом, который будет ставить баны на нежелательных клон-ботов. С другой стороны, при огромной нагрузке на бота при нескольких тысячах join'ов, он конечно не сможет забанить всех клонов. В случае же интеграции, заходы прекратятся сразу после выставления +R на канал, и бот сможет быстро выполнить задачу другого скрипта.
AntiFlood скрипт подгружается командой tcl source scripts/modes.tcl из partyline бота, либо строкой source scripts/modes.tcl в конфиге еггдропа. Благодаря наличию функций-убийц таймеров/утаймеров (они отличаются единицами измерения - минуты/секунды соответственно), скрипт может быть безболезненно перезагружен командой rehash.
Скачать сей TCL скрипт ты можешь по адресу http://kamensk.net.ru/forb/soft/tcl/2.zip. И пусть флуда на твоих каналах будет меньше!