Защита от спама без использования капчи

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

Использование CSS для скрытия полей формы

Можно в форму добавить дополнительные поля, но скрыть их с помощью CSS, чтобы эти поля не были видны обычному, реальному посетителю сайта, т.е. чтобы ему не нужно было их заполнять. При отправке данных через форму, PHP-скрипт, обрабатывающий запрос на стороне сервера, должен проверять данные, переданные в запросе.

Поля HTML формы:



CSS:

.hidefield { display:none; }

PHP скрипт, принимающий данные, отправленные из формы:

if ($_POST['anydata1'] != '' or $_POST['anydata2'] != 'http://') {
   // если поле "anydata1" не пустое или
   // значение поля "anydata2" содержит строку, отличную от "http://"
   // то запрос НЕ принимается, т.е. данные не будут далее обрабатываться или сохраняться в БД
}
else {
   // принимаем данные запроса
}

Этот метод вполне пригоден, но только тогда, если спам-бот не принимает во внимание и не обрабатывает CSS, но таких ботов все же подавляющее большинство.

Использование Javascript для добавления CSS-класса к полям формы

С помощью Javascript можно немного улучшить выше описанный метод — к скрытым полям ввода можно добавлять соответствующий CSS-класс используя Javascript:



Этот метод сработает, если спам-бот не обрабатывает Javascript, но в то же время посетители, у которых в браузере отключена поддержка JS (это часто встречается на смартфонах), будут видеть поля, которые мы пытались скрыть от них.
Можно усовершенствовать и этот метод — зашифровать или закодировать сам Javascript-код. В интернете можно найти много онлайн сервисов для кодирования JS-скриптов.

Изменение имен полей формы с помощью PHP

Чтобы сбивать с толку спам ботов, можно периодически или регулярно менять имена полей HTML-форм. Самый простой способ — использовать функцию date(), например как date('Yz'), где «Y» — это год (2014), а «z» — порядковый номер дня в году (дни нумеруются начинается с 0). В результате date('Yz') вернет значение примерно такое «201446» (2014 год и 46-й день, т.е. 16 февраля).






При использовании такого метода спам-боту придется каждый раз проверять в исходном коде страницы имена полей формы. Однако здесь есть небольшой «подводный камень» — если например посетитель сайта открыл страницу за несколько секунд до полуночи, то при отправки данных заполненной формы после полуночи наш скрипт не примет данные. Чтобы избавиться от этой проблемы нужно добавить еще проверку «вчерашнего» имени поля формы:

$secret = date('Yz');
$secretBefore = date('Yz', time()-86400); // 1 день равен 86400 секундам
if (isset($_POST["field$secretBefore"])
   $secret = $secretBefore;
}

Проверка IP и использование базы данных сайта

Многие спам боты не парсят исходный HTML-код страниц при каждом посещении, а просто пытаются использовать имена полей формы, которые они запомнили при первом сканировании вашего сайта. Это можно с успехом использовать. Нужно всего лишь не выводить в HTML-код форму после того, как спам-бот (или даже «живой» спамер) однажды уже неудачно попытался отправить спам. В таком случае у спамеров не будет шанса подбирать имена полей формы повторно в какое-то ближайшее время, по крайней мере с одного и того же IP адреса. Этот способ защиты от спама довольно эффективен и часто используется.

Создаем в базе данных MySQL таблицу:

CREATE TABLE `spamer` (
 `ip` int(10) unsigned default NULL,
 `timestamp` timestamp NOT NULL,
  KEY `ip` (`ip`));

Взаимодействуем с таблицей базы данных из PHP-скрипта:

$ip = $_SERVER['REMOTE_ADDR'];
// если запрос был отклонен, то записываем IP адрес спамера в БД
mysqli_query("INSERT INTO `spamer` SET `ip`=INET_ATON('$ip');");
// всякий раз, когда кто-то открывает страницу сайта с формой ввода,
// проверяем IP адрес посетителя и время, прошедшее с его предыдущего визита, 
// если его IP уже был записан в БД
mysqli_query("SELECT `timestamp` FROM `spamer` WHERE ip=INET_ATON('$ip') ORDER BY `timestamp` DESC LIMIT 1;");
if (time() - $timestamp < 300) { // 300 - 5 минут
   // выводим сообщение о том, что следующая попытка будет 
   // доступна только через 5 минут (если вы считаете, что нужно выводить сообщение)
}
else {
   // в противном случае отображаем форму ввода
}

Не забывайте только время от времени проверять размер таблицы `spamer`, в которую записываются IP адреса, иначе можно не заметить, как она разрастется до громадных размеров при большой посещаемости и популярности вашего сайта. Хотя, если вы неплохо разбираетесь в PHP и MySQL, то для контроля за таблицей (проверка объема и удаление очень старых записей) можно создать соответствующий скрипт и регулярно запускать его через CRON-задания.

Заключение

В этой заметке приведены для примера несколько относительно несложных методов защиты от спама, отправляемого через HTML-формы. Эти методы можно и нужно использовать на сайтах, разработанных самостоятельно. Для разных же популярных CMS есть большое количество плагинов и расширений, разработанных профессионалами. В них естественно используются более совершенные методы и функционал для защиты как от спам-ботов, так и от «живых» посетителей сайтов, которым неймется «внести свою лепту» в содержимое сайта.

Метки: защита, капча, спам, спам-бот

Поделитесь материалом с другими, воспользуйтесь этими кнопками:
Получать обновления и новые материалы блога по E-mail

29 комментариев к “Защита от спама без использования капчи”

  1. Анна К.:

    Для Вордпресса есть плагин Antispam Bee — тоже добавляет «невидимое» поле, которое видят и заполняют только боты — и этим себя выдают. Но при его установке на блог папка Спам за сутки наполнялась до отказа… было чувство, что боты только и ждали, чтобы обрушиться на блог (до этого стояла капча, где нужно было двигать ползунки — ручной спам появлялся лишь изредка)

    Ответить
    • Владимир:

      Antispam Bee у меня некоторое время работал, но потом стал все комментарии отправлять в спам, а я думал что мой блог никто не комментирует. Перешел на аналогичный плагин -invisible captcha

      Ответить
  2. Дмитрий Геннадьевич:

    А может быть все таки ручками — ручками , и не засорять шаблон всякими скриптами и кодами ?

    Ответить
    • Ручками конечно правильно и надежно, но…
      Что будет, если у вас по каким-либо причинам не будет возможности несколько дней проверять спам? Спамом могут «завалить» ваш сайт, да и ПС потом могут негативно на это отреагировать.
      Включить премодерацию? Тоже не лучший вариант, если вы не часто будете проверять комментарии и прочие «посылки», то у посетителей пропадет желание комментировать, регистрироваться и т.д.

      Ответить
      • Дмитрий Геннадьевич:

        обязательная модерация и уж коли берешься вести блог , то будь добр — просматривай его ежедневно .

        Ответить
        • При большой посещаемости придется не то что ежедневно, а даже ежечасно, а то и чаще просматривать комментарии :)

          Ответить
          • Максим:

            Одно хорошо в небольшой посещаемости, такого огромного количества спама, как на популярных ресурсах, нет. Самое забавное в том, что часто спамные ссылки просто не отображаются, а спамеры всё равно пишут :(

          • Mer:

            Благодарю, Владимир за полезную статью. Действительно, многих посетителей сайта очень раздражает CAPTCHA и некоторым очень трудно её прочитать, даже обновляя рисунок. Ваш вариант намного удобнее для обычного пользователя. Спасибо.

  3. Максим:

    Мне понравился способ с изменением имен полей формы с помощью PHP по дате. Боты на SLAED CMS уже достали.

    Ответить
  4. SEM:

    Пользуемся старым-добрым akismet’ом — спам прорывается, но не часто

    Ответить
  5. Dofollow Ruslan:

    Тоже использую akismet. Спама не много, но и посетителей тоже. Увеличится количество посетителей и вырастет спам — можно будет подумать о дополнительных способах борьбы.

    Ответить
  6. Елена:

    Тоже пользуюсь akismetом, пока все устраивает. Только один раз пропустил спам. Но говорят, что с ростом посещаемости плагин работает хуже.

    Ответить
  7. Александр:

    Подскажите пожалуйста, а что Akismet не защищает от спама? Просто у меня блог молодой и нету пока потока комментариев…

    Ответить
    • От чего же, Akismet неплохо справляется со своей задачей. Однако при очень агрессивном спаме ботами БД блога будет наполняться комментариями, которые Akismet заблокирует, что тоже не очень хорошо, и нужно периодически чистить от заблокированных комментариев блог. Но все же эта статья описывает способы защиты от спама для разного типа сайтов, на которых может и не быть никаких плагинов или расширений для защиты от спама.

      Ответить
  8. bess:

    По мне так самое простое, что можно придумать, вопрос-ответ, так например в аське больше некто левый не стучится больше, и это хорошо, для сайта же использую обязательную регистрацию, кому надо, тот напишет. И полагаю что для ботов оригинальность как лопата в зубы, поэтому придумывайте что-то свое, а тот же вопрос-ответ, может быть оригинальным и простым.

    Ответить
  9. MrVigner:

    На одном из свои сайтов тоже была проблема со спамом, слишком много его шло. На громоздкой картинки-капчи не хотел ставить, так как сам не люблю когда на сайтах приходится код вводить. Решение было простым — плагин Invisible Captcha, — отлично справляется, спамные коменты только в спам идут, а на модерацию — только нормальные))

    Ответить
  10. Михаил:

    Тоже использовал похожий способ. Только не с скрытыми полями, а со скрытыми маленькими изображениями в виде ссылки невидимыми для человека. После того как робот переходит по ссылке — баню его по айпи. Иногда что-то просачивается, но в целом норм

    Ответить
  11. Вадик:

    Рецептик и вправду отличный, давно искал, что-то подобное, чтобы от капчи избавится, но плагином захламлятся тоже не хотелось. А этот способ нормально, уже опробовал. Спасибо

    Ответить
  12. Михаил:

    Invisible Captcha спасибо за наводку. На одном из сайтов сейчас вообще не стоит никакой защиты. Спаму куча. Но пока справляюсь. Но если запустить то завалят капитально.

    Ответить
  13. Aster:

    Раздражает CAPTCHA, которая заставляет вводить цифры, если собрать яркий рисунок-пазл вряд ли это кого-то из посетителей отпугнет

    Ответить
  14. Developer:

    Ребят все это очень хорошо, но такие манипуляции дают почти никакого эффекта если вас спамят боты, а не реальные люди. Я уже не говорю про mysql инъекции — до них в посте дело не дошло. JavaScript не поможет вам от ботного спама — если вас будут серьезно спамить то никто не будет обращаться к станице с формой, а напрямую будут отправлять данные в ее обработчик. Например вчера я таким способом зарегистрировал на одном сайте 200 пользователей используя php for цикл.
    Заключение: не доверяйте данным пользователя — проверяйте хотя с вашего ли сайта пришли $_POST данные. В php даже можно проверить с какой страницы они пришли.
    Если вы все еще не верите мне — посмотрите как работают c_url() функции в php :)

    Ответить
  15. Позитив:

    прост добавляешь поле чекбокс, значения которого прописаны в базе и меняются постоянно + ключ и все :))

    Ответить
  16. Natalya:

    Ох, как сложно. По мне проще плагин Askimed установить, но ручками, конечно же лучше..

    Ответить
  17. Княгиня:

    Ух ты. Способ с автоматической сменой имени поля по дате мне не попадался. А я просто подменяю имя одного из типовых полей, так что боты попадают в ловушку, а живые пользователи отправляют нормально. Очень действенный способ, давно пользуюсь, режет кучу спама. Только при обновлении движка приходится делать правку заново — затирается. По идее, кто-то уже должен был придумать способ от этого избавиться, ибо способ старый.

    Ответить
  18. Илья:

    В качестве простого решения может сгодиться какой-нибудь «2+2″ или «поставьте галку если вы не бот», хотя по сути это тоже капча :)
    Как-то на хабре была статья по теме: http://habrahabr.ru/post/151084/

    Ответить
  19. Самсоненко Алексей:

    Я в WordPress использую плагин Akismet, отличная штука. Ни одного спам комментария не пропустила :)

    Ответить
  20. Герман:

    А можно запретить определенные теги к примеру если данный тег присутствует блокировать с помощью jquery.

    Ответить
  21. softvlog:

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

    Ответить
  22. Stas:

    Насколько знаю если брать капчу, то надо ставить «собери рисунок(пазл)» — вроде еще не взломали …. А статья интересная! Много подчеркнул, понравилось изменение имен полей формы.

    Ответить

Оставить комментарий

Уважаемые посетители, пожалуйста, пишите осмысленные и исчерпывающие комментарии. Короткие фразы типа «спасибо автору», «возьму на заметку», «мне помогло» и т.п. будут удаляться. Исключение, когда Вы отвечаете на чей-то вопрос или благодарите за помощь.

Ссылки на Ваш сайт получат статус DoFollow после третьего комментария.

Для вставки кода в комментарии можно использовать BB-коды:
[text] [/text], [php] [/php], [html] [/html]

Подписаться на обновления блога 4remind.ru по RSS
Новости блога в социальных сетях

4remind.ru - персональный блог вебмастера



Наверх
Наверх