Очередное анти-спам решение.

Благодаря этому и этому спам-боты на моем сайте себя не проявляют — они регистрируются, пытаются что-то постить, но реального вреда от них нет. Разве что они засоряют список пользователей, в особенности «Онлайн».
Это не сильно мешает, но иногда раздражает. Идея доотсеивать пользователей на основе их поведения зрела уже давно, но сесть и реализовать (хотя бы прототип) получилось только сейчас.

Подробности и инструкции под катом.

Как и для чего

Плагин реализовывает идею анализа поведения пользователей для присваивания им статуса "bot"/"human" с помощью начисления очков в каждой категории. Т.е. есть набор правил, которые на основе собранных данных начисляют 10-20-100 очков в категории бот или человек, а потом по сумме очков проставляется статус (или же оставляется нейтральный unknown). Идея в том, что бы явно отсечь граничные значения (например бот обращается только к страницам добавления топика, а человек в процессе пользования сайта посещает много разных урлов), а так же, возможно, как-то ограничить пользование сайтом подозрительным личностям.
В будущем, есть планы собирать информацию о мэйлах и ip-адресах регистрирующихся спам-ботов и вводить какую-то шкалу доверия почтовому серверу и/или ip.

На данный момент ведется статистика вызова action_event для каждого пользователя (пользователь — acttion_event — количество вызовов), а так же проводится простой анализ этой статистики:
— пользователь ходил только на topic_add;
— пользователь ходил на небольшое число урлов, при этом много ходил на topic_add;
— пользователь ходил на большое число урлов.

Для пользователей, помеченных как человек статистика писаться перестает (по желанию), а боты могут быть либо удалены из БД, либо администратор будет просто проинформирован, что определенные пользователи помечены как боты.

Правила

Механизм правил изначально затачивался под расширение. Плагин предусматривает два варианта добавления новых правил:
/*
 * Тип подключения правил проверки "бот - человек"
 * folder - инклудятся все правила из директории
 * list - инклудятся конкретные правила
 */
$config['rule_enabled_method'] = 'folder';
$config['rule_enabled_method_list'] = array();


В принципе, правила подключаются не часто, поэтому можно поставить тип folder и просто кидать новые правила в директорию plugins/botchecker/classes/rules/

Правило должно наследоваться от CommonRule и обязательно реализовывать два метода:

Формирование списка проверяемых пользователей. Может получать весь список юзеров, а может только часть. Зависит от логики правила.
public function InitUsers(){
		$this->aUserIds = ...
		reset($this->aUserIds);
	}


И, собственно, валидация пользователя, где ему назначаются очки «бота» или «человека».
	public function Validate($oUser){
		parent::Validate($oUser);
		...
	}


Реализованное сейчас правило позволяет проверять количество вызов разных Экшенов/Эвентов и количесво вызова Экшена topic_add. Настраивается это в массиве:

$config['rules']['onlytopicaddrule'] = array(
	'only_add_counter_min' => 10, 			//Количество повторов действия topic_add, 
											//при условии, что других действий не было
	'only_add_bot_score' => 100,			//Количество очков "бот" при срабатывании метрики
											//"только topic_add"
										
	'not_only_add_action_count' => 5, 		//Максимальное количество различных действий
											//при котором проверятеся кол-во действий
											//topic_add
	'not_only_add_counter_min' => 20,		//Количество действий topic_add, при котором метрика 
											//not_only_add срабатывает
	'not_only_add_bot_score' => 100,			//Количество очков "бот" при срабатывании метрики
											//"not_only_add"

	'different_action_count' => 10,			//КОличество различных действий, при которых не проверяется
											//кол-во повторений topic_add
	'different_action_human_score' => 100,	//Количество очков "человек" при срабатывании метрики
											//different_action
);


В принципе, комментарии к параметрам довольно понятны, но на всякий случай еще раз логику их работы:

1. Если у пользователя в статистике только действие topic_add и оно совершено более only_add_counter_min, то ему начисляется only_add_bot_score очков в категории бота.
2. Если у пользователя от 1 до not_only_add_action_count действий в статистике, при этом действие topic_add совершено более not_only_add_counter_min раз, то пользователю начисляется not_only_add_bot_score очков в категории бота.
3. Если у пользователя более different_action_count разных действий в статистике, то он получает different_action_human_score очков в категории человека.

После назначения очков пользователям присваиваются статусы согласно настройке:
$config['bot_score_level'] = 100;
$config['human_score_level'] = 100;


Для пользователя со статусом человек можно отключить сбор статистики:
$config['human_write_counter'] = false;


А для бота настроить одно из следующих поведений:
/*
 * Что делать с пользователями, которых система признала ботом
 * notify - уведомить администратора о присвоении статуса "бот"
 * delete - удаление пользователя, если у него нет топиков, комментариев.
 */
$config['bot_after_check_action'] = 'delete';

*в конифге в комментарии приведено больше вариантов обработки, но они еще не реализованы.

Обязательный отчет будет отправлен на
$config['notify_email'] = '---';


Запуск проверки пользователей

Проврка пользователей происходит в фоне средствами скрипта:
plugins/botchecker/classes/cron/validateUser.php

При увеличении числа правил скрипт может стать более ресурсоемким. Так же скрипт сбрасывает после себя весь кеш, так как выполняет удаление из БД и кеш пользователей после таких операций «протухает».

Пример отчета:
[delete] Simple delete user with id=1010117
[delete] Simple delete user with id=1010118

Плагин пару дней работает у меня и пока особых проблем с ним я не замечал, в день выпиливаю около 20 спам-юзеров. Но в любом случае его статус beta.
Будьте аккуратны и ставьте на свой страх и риск!


Плагин можно взять на GitHub.
В каталог я его отправлю, но пока нет уверенности, что он сможет пройти модерацию — всё же еще сыровато, на мой взгляд.

6 комментариев

avatar
Респект за реализацию крутого плагина, а то достали уже эти боты!
avatar
На всякий случай — в данный момент данный плагин выпиливате ботов постфактум. Т.е. бот всё же регистрируется (в моем случае не может постить), проявляет подозрительную активность и вечером выпиливается из БД нафиг.
avatar
Уже есть плагины, которые разными механизмами не дают ботам регистрироваться (Antispam, Total antispam) и/или имеют сходный механизм оценки поведения пользователя с автоматическим удалением и проверкой в черных списках мейлов/айпишников (Total antispam). Это была минутка рекламы. Теперь к вашей реализации.
В целом идея анализа поведения пользователей в таком виде очень интересная, но весьма ресурсоемкая если не использовать фильтры пользователей — к примеру вести статистику по пользователям которые только зарегистрировались, имеют рейтинг ниже определенного порога, или не имеют опубликованных материалов. Кроме того, ваша реализация не отлавливает ботов, которые регистрируются «про запас» и в текущий момент времени никак себя не проявляют.
avatar
В целом идея анализа поведения пользователей в таком виде очень интересная, но весьма ресурсоемкая если не использовать фильтры пользователей
Это да, поэтому те, кто уже признан «человеком» и не логирую, только остальных.

Кроме того, ваша реализация не отлавливает ботов, которые регистрируются «про запас» и в текущий момент времени никак себя не проявляют.
А вот это следующий шаг — хочеться почистить список пользователей от «мертвых» аккаунтов.

Ну и на единственность и верность реализации я не претендую. Скорее хотелось пойти в сторону открытого и расширяемого (силами, опытом или советами сообщества) решения.
avatar
У меня на днях зарегалось около 50 ботов, снёс всех через админку за 5 секунд, включил активацию по e-mail, пока тишина.
avatar
Поставил. Буду посмотреть. Спасибо за плагин!
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.