Начну с того, что у меня есть некий Django портал, на котором пользователям начисляются определенные бонусы за приглашение новых пользователй. Такая себе системе рефералов. Но бонус начисляется только в том случая, если приглашенный пользователь проявляет активность. Сегодня у меня возникло подозрение, что один из моих юзеров завел виртуалов. Попробуем уличить его в этом…
У меня в каждом проекте есть апликуха core, где я держу всякие полезные утилиты. В этой апликухе создадим файл middleware.py.
import logging import logging.handlers bytes=1024000 count=10 formatter = logging.Formatter("%(asctime)s-%(message)s") MODELS_FILE = '/home/ramovsky/users.log' logmodels = logging.getLogger('users') logmodels.setLevel(logging.DEBUG) handler = logging.handlers.RotatingFileHandler(MODELS_FILE, maxBytes=bytes, backupCount=count) handler.setFormatter(formatter) logmodels.addHandler(handler) class TrackUsersMiddleware(object): def process_request(self, request): ip = request.META.get('REMOTE_ADDR', '') or request.META.get('HTTP_X_FORWARDED_FOR', '') logmodels.debug('%s %s %s'%(request.user, request.path, ip))
Добавим миддлвер в settings.py
MIDDLEWARE_CLASSES = ( #----- cut ----- 'core.middleware.TrackUsersMiddleware', )
И нужно не забыть добавить генерацию заголовка 'HTTP_X_FORWARDED_FOR' в /etc/nginx/nginx.conf
location / {
#---- cut -----
fastcgi_param REMOTE_ADDR $remote_addr;
}
Перезапускаем Django и Nginx. Смотрим лог grep -E 'AnonymousUser|User1|User2' users.log, анализируем.
В общем в зависимости от того насколько пользователь знаком с интернет технологиями и от размера бонуса, возможно несколько вариантов событий:
Нуб будет делать все руками с текущего IP. Такого человека отследить легко по записям типа
2011-04-20 14:00:03,123-AnonymousUser /accounts/login/ 80.91.173.10
2011-04-20 14:00:22,967-User1 Куча активности
2011-04-20 14:00:22,967-User1 /logout/ 80.91.173.10
2011-04-20 14:01:03,123-AnonymousUser /accounts/login/ 80.91.173.10
2011-04-20 14:01:22,967-User2 Куча активности
2011-04-20 14:01:22,967-User2 /logout/ 80.91.173.10
Все действия совершаются с одного IP и от имени разных пользователей поочередно.
Продвинутый пользователь будет пытаться скрытся используя динамический IP или прокси.
2011-04-20 14:00:03,123-AnonymousUser /accounts/login/ 18.11.173.10
2011-04-20 14:00:22,967-User1 Куча активности
2011-04-20 14:00:22,967-User1 /logout/ 18.11.173.10
2011-04-20 14:01:03,123-AnonymousUser /accounts/login/ 34.91.173.10
2011-04-20 14:01:22,967-User2 Куча активности
2011-04-20 14:01:22,967-User2 /logout/ 34.91.173.10
IP разные, но действия псевдо пользователй строго поочередные.
Если за дело взялся программер, то отловить его будет крайне сложно, если он будет пользоваться прокси и напишет скрипт эмуляции активности пользователя. В тяжелых случаях уже нужно работать с психологией, а не техникой. Нужно дать человеку легко получать бонусы, что бы ослепленный жадностью и безнаказанностью он утратил бдительность и его скрипты приобрели характерное отображение в логах.
А вообще я всем желаю хорошых и честных юзеров. Ведь преджде всего ради них мы и пишем наши порталы.

