Простая защита от спама на сайте

Скрипты Прокомментировать

Всех с наступившим Новым Годом. Давно здесь не писал, но это не потому, что сказать нечего, а просто от лени. Все силы идут на другие проекты, поэтому блог немного забросил.
Новый год принёс нам кроме новых радостей и новые проблемы. Довольно часто в последние дни приходится читать на разных форумах, что количество спама, приходящего на сайты, возросло в разы. А всё от того, что вышла новая версия Хрумера – программы для спама, которая судя по результатам, может спамить эффективнее, чем её предшественники.
В этой статье опишу свой метод борьбы со спамом, простой как пять копеек, но в то же время довольно эффективный.
Для начала посмотрим на проблему со стороны нашего противника – спамера. Это человек, у которого есть свои сайты/дорвеи, он хочет получить на них большое количество ссылок. Для этого спамер запускает программу, которая ищет в интернете сайты, заходит на них и оставляет какие-то комментарии со ссылками.
Эта программа довольно умна, она скачивает страницу сайта, находит на ней форму для ввода сообщений, анализирует имена текстовых полей. Она также может скачать защитную картинку-каптчу. Если каптча простая – то программа сама определит, что на ней нарисовано. Если каптча посложнее – то программа отдаст её на обработку людям (благо есть работники, согласные расшифровывать 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. И самое главное – проверьте, могут ли простые пользователи отправлять свои сообщения после установки спамозащиты.

Комментарии (18) к “Простая защита от спама на сайте”

  1. DimaX:

    Заюзал описанную функцию у себя вместо задолбавшей всех капчи, посмотрим, как пойдет дело :)

  2. Kirill Mazur:

    Привет. Тоже сталкивался вопросом теста на робота без картинок, php и сессий наткнулся на идею проверки с — помощью javascript времени пребывания на странице до постинга коммента (у себя описал несколько подробнее).

  3. zweroboy:

    Kirill Mazur, тоже хорошее решение. Но суть не сильно отличается. У меня проверочное значение константа, а у Вас это число секунд на странице.

  4. shagimuratov:

    Еще есть сервисы защиты от спама – Akismet, Mollom и Клинтолк. Плюсы в том, что живые люди комментируют сообщения без капчи и ожидания ответа от модератора + сервисы коммерческие, т.е. борются с автоматическим спамом не на шутку, а в серьез :)

  5. zweroboy:

    shagimuratov, вот именно Akismet у меня и стоит на этом бложике. Я вполне доволен, спам не проходит, сейчас написано в статистике, что он защитил от 67 тысяч спамо-сообщений, неплохой результат :)

  6. migli:

    а как же насчет человек сидит с телефона?

  7. Прохожий:

    Отключаем JS и все, приплыли. Говно, а не решение!

  8. zweroboy:

    Я ж писал:
    >>> Есть какой-то жалкий процент пользователей с отключенным JS, но я ими пренебрегаю.

    Сейчас глянул статистику того сайта, где использую этот приём, юзеров без js там оказалось аж 0.35%. И мне по большому счету наплевать на них. Мне важнее 99.65% юзеров, которые будут избавлены от нужды вводить каптчу.

    Конечно, если у Вас стоит задача угодить всем 100% пользователей – то это решение не подходит. Но не забудьте, что при использовании другой каптчи 100% людей удовлетворить тоже не получится. Какую бы капчу Вы не ставили – всё равно какой-то процент людей, больший 0 не сможет её ввести.

  9. Марина:

    Здравствуйте!
    У меня ,как раз ситуация . Меня просто засыпают спамными письмами. В день я получаю 500 600 комментариев но они похожи на спам . Хотя содержание вроде как обычного комментария. Я уже на сайте активировала функцию , что писать комментарии могут только зарегестрированные пользователи. Но комментарии продолжаются .

  10. Иван:

    Марина дак поставьте вышеописанную защиту на свой сайт.
    А я недавно придумал похожий способ защиты, но немного более изошрённый. Суть та-же, но JS обработчик должен вписать в hidden поле не константу, а сумму случайно сгенерированных (на сервере) чисел. А ответ сравнивается с ответом внесённым сессию (массив $_SESSION). Таким образом, даже, если бота научить выполнять JS или разбор по фиксированной форме, то ему ещё нужно будет поддерживать Cookie и как следствие зайти на страницу 2 раза: 1-й для того чтобы получить форму, пример для расчёта и Cookie, а 2-й, для того, что бы отправить форму с ответом и Куками

  11. Олег:

    подскажите пожалуйста, где в vbulletin вставляется этот код, в каком шаблоне if ($_POST['check'] != ‘secretcode’) exit(‘Spam decected’); ?
    Спасибо.

  12. Николай:

    Прохожий, в каком году живём. Сейчас мало сайтов работают без javascript. Скажу даже больше: большинство сайтов, конечно если разработчик не отстаёт от времени, работают на основе js. Из-за библиотек js и ajax.
    Олег, Надеюсь что поля формы, которые посылаете на сервер обрабатываете/ Вот там где обрабатываете поля формы, туда и вставляете код.

  13. Валерий:

    Спасибо Автору, гениально просто и эффективно.

  14. Румико:

    Большое спасибо автору. Проверю на своём сайте. Спам уже задолбал.

  15. Лариса:

    очень хорошая статья. зачет автору.

  16. vkmarket:

    http://www.vkmarket.org – Продажа аккаунтов и групп в контакте, SMM продвижение.
    На нашем портале вы можете купить аккаунты, сообщества и программы Услуги вконтакте и соц. сетях.
    Все инструменты для продвижения и рекламы. Информативные разделы: Блог и Форум.
    Популярные разделы: Блог о вконтакте, Форум о вк.

  17. ProVkMarket:

    vkmarket.pro – Продажа аккаунтов в контакте и соц. сетях

    У нас вы можете купить аккаунты в контакте с подписчиками, а так же акки вк с коротким и красивым айди
    Большой выбор страниц, низкие цены и большой выбор, аккаунты с полной перепривязкой на ваши данные.
    Спам-блок, ретрив, актив, неактив, с привязкой и без привязки, фейки с историей и фото.
    Аккаунты под различные нужды для ведения бизнеса в vk.com раскрутки и монетизации.

    Всё необходимое для рассылок, раскруток и проверок – чекеры, софт, накрутки.
    Разработка дизайна и сайтов, а так же оформление сообществ вконтакте

    Будем рады видеть вас на нашем портале.

    Онлайн магазин аккаунтов и групп в контакте и социальных сетей.
    Сервис по продаже страниц и сообществ вк, услуги по продвижению, накрутки, регистрации.
    Программы для спама, рассылок и раскруток, услуги веб дизайна и оформление групп vk
    Купить акки и группы вконтакте с подписчиками, с короткими и красивыми айди ( ид/id )
    Большой выбор, низкие цены, рекомендации, обучение вк, заработок вк, смена тематики.

    Предоставляем отзывы и гарантии, идентифицированные кошельки, все виды оплат.

  18. Vetal:

    Данный метод не срабатывает, все равно приходят спам-письма :( Подскажите, как можно решить эту проблему с помощью добавления somefunction(). К сожалению не силен в JS. Заранее спасибо

Прокомментировать

Сообщения в RSS Комментарии в RSS Войти