Foren / National / Russian / Модули и плагины / Автобан

Автоматический банн IP

Amro
#6712 4. Februar 2009, 21:23
Есть предложение по внедрению в Cotonti Автобана, под Seditio для своих проектов я уже это реализовал и успешно применяю.

У меня таким способом банятся все спам роботы и челы желающие проверить меня на дыры XSpiderom и всякими другими сканерами

В чём суть :

Итак, у нас есть так называемый "Системный лог", куда сыпятся все ошибки. Нас интересуют только системные ошибки, т.е. в таблице sed_logger значение поля log_group. Есть смысл проводить временной анализ этой таблицы, к примеру брать 30 мин, и проверять начиная с текущего времени за минусом 30 мин, количество ошибок с группой "sec". И если к примеру за 30 мин у вас 5 ошибок уровня "sec", то банить этот IP к примеру на неделю. Все параметры можно сделать чтоб задавались в конфиги того же банлиста:
Пример хака который я использую для Seditio на своих проектах, для Cotonti он тоже подойдёт :

файл common.php
вставляем прямо перед разделом

/* ======== Check the banlist ======== */

/* ========== Auto Banlist System ============ */

$now_time = $sys['now']; // текущее время
$old_time = $sys['now'] - 1800; // время за минусом 30 мин
$usip = $usr['ip']; // собственно IP 
$count_ban_ip = 0; // количество ошибок
// далее делаем запрос к таблице логов и выдираем логи за последние 30 мин.
$sql = sed_sql_query("SELECT log_date, log_ip, log_group FROM $db_logger WHERE log_date < '$now_time' AND log_date > '$old_time'");

while ($rowban = sed_sql_fetcharray($sql))
{
//если в логе системная ошибка, то накручиваем счётчик
	if (($usr['ip'] == $rowban['log_ip']) && ($rowban['log_group'] == "sec") )
	{
		$count_ban_ip++;		
	}
}
// если за 30 мин более 5 ошибок, то баним IP на делелю
if ($count_ban_ip > 5)
 {
//проверям не забанен ли уже IP
	$sql_ban = sed_sql_query("SELECT COUNT(*) FROM $db_banlist WHERE banlist_ip = '$usip'");
	$count_ban = sed_sql_result($sql_ban,0,"COUNT(*)"); 
	
	if ($count_ban == 0)
	 {
// текущее время + неделька
		 $ban_expire = $now_time + 604800;
		 $sql_insert = sed_sql_query("INSERT INTO $db_banlist (banlist_id, banlist_ip, banlist_reason, banlist_expire) 
										VALUES ('', '$usip', 'Your IP address is banned for 1 week!', '$ban_expire')");
	 }
 } 
Если идеологу интересно ) то можно это сделать и в стандарте к Cotonti.
Сам считаю это незоменимой вещью, если нет тогда наклена нам вообще этот лог )))
P.S. админа в этом хаке не учитывал )