В последнее время большинство 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. И пусть флуда на твоих каналах будет меньше!

Оставить мнение

Check Also

Как сделать игру. Выбираем движок и пишем клон тех самых «танчиков»

С каждым днем игры становятся все сложнее и навороченнее. Быть инди, а точнее соло-разрабо…