Всех с наступившим Новым Годом. Давно здесь не писал, но это не потому, что сказать нечего, а просто от лени. Все силы идут на другие проекты, поэтому блог немного забросил.
Новый год принёс нам кроме новых радостей и новые проблемы. Довольно часто в последние дни приходится читать на разных форумах, что количество спама, приходящего на сайты, возросло в разы. А всё от того, что вышла новая версия Хрумера – программы для спама, которая судя по результатам, может спамить эффективнее, чем её предшественники.
В этой статье опишу свой метод борьбы со спамом, простой как пять копеек, но в то же время довольно эффективный.
Для начала посмотрим на проблему со стороны нашего противника – спамера. Это человек, у которого есть свои сайты/дорвеи, он хочет получить на них большое количество ссылок. Для этого спамер запускает программу, которая ищет в интернете сайты, заходит на них и оставляет какие-то комментарии со ссылками.
Эта программа довольно умна, она скачивает страницу сайта, находит на ней форму для ввода сообщений, анализирует имена текстовых полей. Она также может скачать защитную картинку-каптчу. Если каптча простая – то программа сама определит, что на ней нарисовано. Если каптча посложнее – то программа отдаст её на обработку людям (благо есть работники, согласные расшифровывать 1000 картинок за 1$ (вот уж адский труд, мне бы такую работоспособность – уже давно бы миллионером был… ну да ладно, не будем отвлекаться)). Итак, программа знает всё о форме для ввода комментариев. Также у неё есть данные о многих популярных движках (joomla, phpbb, vbulletin, dle, drupal и др.) и о том, как каждая из этих cms борется со спамом в комментариях. Итого, у спамеров есть все данные для того, чтобы загадить наш хороший белый сайт, на какой бы cms он ни был. Я их даже не осуждаю за это, у них свой бизнес. Тем более, что в борьбе со спамом всё-таки победа всегда будет за веб-мастером, если он хоть немного позаботится о защите своего сайта.
Как правило, столкнувшись с проблемой спама, веб-мастер идёт в поисковик и ищет какое-то решение по защите своего сайта. Он находит его. Ставит навороченную каптчу либо же какие-то дополнительные вопросы типа «напишите в поле сколько будет 2+2″. И первое время эта защита действует и спам исчезает. Но спамеры ведь тоже не спят. И как только какой-то из способов защиты становится популярным – они находят для него противодействие. Следовательно, надёжная защита должна быть нестандартной. Она не должна стоять на сотне тысяч сайтов, иначе у спамеров появится стимул с ней бороться. Если же такая система защиты будет стоять только на одном нашем сайте – то её даже никто не заметит. Спамерам нет смысла парится ради одного нашего сайта (если конечно наш сайт не монстр типа vkontakte или чего-то подобного. Я наверное даже буду гордиться, если узнаю, что кто-то когда-то сделал спамилку специально для одного из моих сайтов – это уже показатель, что сайт чего-то да стоит).
На этом лирическое вступление заканчивается. А вывод из него такой – требования к хорошей защите от спама:
1. Нестандартность (это главное требование).
2. Простота для веб-мастера (не хочу тратить на настройку спамозащиты больше 5-10 минут).
3. Простота для пользователя (наш сайт ведь белый и пушистый, напрягать юзера вводом сложных captcha мы не будем).
В моей защите я воспользовался тем, что спамоботы не выполняют javascript на страницах сайта, а у подавляющего большинства пользователей он включен. Есть какой-то жалкий процент пользователей с отключенным JS, но я ими пренебрегаю. Пускай включают, если хотят нормально пользоваться моими сайтами.
И теперь, собственно пара строчек кода.
1. В форму, которую хотим защитить, добавляем поле:
1 | <input id="check" name="check" type="hidden" value="" /> |
2. В кнопку, по которой идёт отправка, добавляем
1 | onclick="document.getElementById('check').value = 'secretcode';" |
Например, если код кнопки был такой:
1 | <button type="submit">Отправить</button> |
то мы его превращаем в такой
1 | <button onclick="document.getElementById('check').value = 'secretcode';" type="submit">Отправить</button> |
3. В php-скрипте, который проверяет данные из формы делаем что-то типа:
1 | if ($_POST['check'] != 'secretcode') exit('Spam decected'); |
Суть проста – при клике пользователя на кнопку «Отправить» джаваскрипт записывает в пустую переменную секретное значение. И от живого человека переменная приходит с этим значением, а от бота она приходит пустая, т.к. он не выполняет JS. Вот и вся хитрость. На форуме vbulletin, где я поставил такую защиту, спама нету уже 2 года. На одном самописном сайте тоже уже полгода без спама обходимся, хотя никакой каптчи нет, только эта защита. Сейчас вот на один сайт на joomla поставил такую защиту, т.к. злые спамеры повадились слать мне по 20 писем в час через форму обратной связи.
Как Вы понимаете, это только общая схема. Название поля check и значение проверочной переменной secretcode можно и даже желательно поменять на любые другие по своему усмотрению. В php-обработчике возможно надо будет работать не с массивом $_POST, а с каким-то другим. В вышеупомянутой джумле я эту переменную находил так:
1 | $check = JRequest::getVar( 'check', '', 'post' ); |
Также можно не просто делать exit для ботов в пхп, а выдавать им какое-то красивое сообщение об ошибке с помощью стандартных средств CMS. Всё-таки есть небольшая вероятность, что эту проверку не пройдет и живой человек (с откл. JS), вот для него можно и немного постараться.
Самое трудное в методе – это найти, где же в CMS находится форма, через которую спамеры шлют комментарии, и где находится функция, принимающая данные из той формы. Для vbulletin и joomla у меня вся эта процедура поиска и правки занимала минут 10-15. Для самописного движка, который я знаю как свои 5 пальцев, на правку понадобилось пара минут.
Не претендую на лавры первооткрывателя этого способа – сам его увидел года 3 назад на одном из форумов.
Если боты станут настолько умными, что смогут понимать, что в onclick кнопки находится та переменная, которую им надо будет потом отдать обработчику, то можно усложнить их задачу. И в onclick написать somefunction(), а эту somefunction() вынести в отдельный джавоскиптовский файл и там каким-то небанальным образом присвоить полю check нужное значение.
Конечно, при желании можно обойти практически любой метод защиты, но данный метод пока не на столько распространён, чтобы спамеры тратили время на его обход.
Вот и всё, желаю Вам побед на ниве борьбы со спамом на Ваших сайтах.
P.S. И самое главное – проверьте, могут ли простые пользователи отправлять свои сообщения после установки спамозащиты.
Январь 15th, 2011 at 14:04
Заюзал описанную функцию у себя вместо задолбавшей всех капчи, посмотрим, как пойдет дело
Январь 18th, 2011 at 22:32
Привет. Тоже сталкивался вопросом теста на робота без картинок, php и сессий наткнулся на идею проверки с — помощью javascript времени пребывания на странице до постинга коммента (у себя описал несколько подробнее).
Январь 19th, 2011 at 15:14
Kirill Mazur, тоже хорошее решение. Но суть не сильно отличается. У меня проверочное значение константа, а у Вас это число секунд на странице.
Март 27th, 2011 at 9:36
Еще есть сервисы защиты от спама – Akismet, Mollom и Клинтолк. Плюсы в том, что живые люди комментируют сообщения без капчи и ожидания ответа от модератора + сервисы коммерческие, т.е. борются с автоматическим спамом не на шутку, а в серьез
Март 28th, 2011 at 22:42
shagimuratov, вот именно Akismet у меня и стоит на этом бложике. Я вполне доволен, спам не проходит, сейчас написано в статистике, что он защитил от 67 тысяч спамо-сообщений, неплохой результат
Июнь 2nd, 2011 at 20:19
а как же насчет человек сидит с телефона?