Случилось так, что мой форум не взлюбил один спаммер и решил его завалить мусором. Я вступил с ним в борьбу, попутно изучил PHP. Эта тема будет актуальна я думаю, всем админам.
Сначала мой форум был совершенно незащищен от спама - в нем любой мог создать или ответить в тему. Спаммер использовал это и написал робота, который постоянно создавал на моем форуме новую тему. Это была страничка, имитирующая отправку данных в мой форум, поставленная с помощью java-script на зацикливание.
На форуме по умолчанию был установлен флуд-интервал в 30 секунд и вот каждые 30 секунд на форуме создавалась новая тема.
Сначала я удалял спаммерские сообщения с помощью администраторского мода phpbbmyadmin напрямую через SQL запросы. Однако это отнимало много времени и мне пришлось написать скрипт, в котором можно было выло выбрать, какие посты удалять. Я просто модифицировал скрипт поиска, встроенный в PHPBB. Но оказалось, что недостаточно просто удалить сообщение, нужно еще и пересчитать ссылки на первое и последнее сообщение в форуме. Пару раз я на этом погорел, но с честью восстановил форум и дописал скрипт.
Однако надо было что-то предпринимать и я встроил в отправку сообщений тест тьюринга - пользователю перед отправкой сообщения показывалась картинка из трех цифр, он должен был ввести эти цифры. Если ввод был удачным, сообщение помещалось в форум, иначе сообщалось об ошибке. Тут я немного промахнулся, вставив проверку в форму отправки сообщения, а спаммер настроил своего робота на следующую форму - подтверждения отправки. Пришлось поправить код и теперь код тьюринга обойти было нельзя - он вызывался перед отправкой.
Я думал, что все окей. Но не тут-то было. Неугомонный спаммер (его бы энергию да в мирное русло!) воспользовался тем, что на моем форуме для регистрации пользователей не нужно было подтверждения по e-mail. Он написал скрипт, который регистрировал много фиктивных пользователей и начал мусорить уже сообщениями от якобы зарегистрированных пользователей.
Пришлось мне временно выставить тест тьюринга всем пользователям. Потом, правда я поправил код, чтобы тест тьюринга выдавался только зарегистрированным пользователям без ранга, т.е. только что зарегистрированным. Ранг я назначал вручную.
Однако были изъяны в самом коде тьюринга. Во первых было всего 888 комбинаций кода (111-999), которые легко было перебрать роботу буквально за одну минуту. Пришлось переписать код, чтобы после трех неудачных попыток ввода кода тьюринга пользователю блокировалась отправка этого сообщения и он должен был обновить страницу, чтобы получить новый код тьюринга.
Ко всему прочему, цифры в картинке выводились все время в одну позицию, поэтому для кодов 111-999 по размеру картинки и ее CRC можно было заранее сказать, что это за цифра. Т.е. распознать по картинке цифру можно было без проблем. В принципе, если бы вывод цифр в картинку ограничился только перемещениями цифры по полю, подсчитав количество точек в картинке можно было судить о том, что это за число. Пришлось поправить модуль отрисовки, чтобы каждый вывод картинки был уникальным.
Борьба продолжается. Спаммер опять засорил мой форум и я с удовольствием принимаюсь за чистку.
Не так давно мне пришла в голову идея ограничивать число новых тем и сообщений, которые могут отправлять анонимные пользователи. Для своего форума я установил 5 тем и 30 сообщений в сутки. В те дни, когда спаммеры не сорят, пользователи могут оставлять сообщения анонимно. А ограничение в 5 тем способствует красивому внешнему виду форума. Эту защиту спаммеры обойти не смогли. :)
Но не все так печально, господа. Если форум нужно по настоящему защитить от спама, нужно сделать активацию учетных записей пользователей через e-mail и разрешение на создание сообщений только зарегистрированным пользователям. При этом нужно блокировать (ставить баны) на почту пользователей-роботов и удалять самих этих роботов.
Конечно, анонимные пользователи не смогут оставить свои сообщения, но это общая беда интернета и виновны в этом спаммеры. Можно также назначить лимит сообщений от анонимных пользователей. По идее любой спаммерский скрипт не будет работать вечно - для этого нужны ресурсы и вскоре анонимные пользователи смогут нормально работать на форуме.
Ну и чтобы совсем подсластить пилюлю, скажу что уже очень скоро появятся службы по авторизации пользователей, которые можно будет поставить на свой сайт. Тогда все пользователи будут авторизованными и проблема анонимных пользователей будет исчерпана.