защита от автоматическго спама на сайте

Защита от спама в комментариях без плагинов

В конце октября на моём блоге сложилась очень сложная ситуация со спамом в комментариях. С увеличением количества статей резко выросло число спамных комментариев. За сутки набиралось 100-150 сообщений. Мне даже стали жаловаться читатели, которые были подписаны на уведомления о новых комментариях, на то,что их замучили многочисленные сообщениях о новых бесполезных комментариях.

На тот момент у меня не было достаточно времени, чтобы разобраться в ситуации и найти эффективное решение проблемы, поэтому я просто настроил полную премодерацию комментариев на блоге. Но проблема осложнялась тем, что мне приходят на почту уведомления о событиях на сайте. Сами понимаете, что мой почтовый ящик был завален сотнями писем в день. Я тратил по 30-40 минут в сутки, чтобы разобраться с почтой и комментариями на блоге.

В ноябре мне всё это надоело, и я решил разобраться в сложившейся ситуации более детально. Но… В Интернете я не смог найти описание того, как работают современные спам-боты — автоматические комментаторы. Да-а-а… Как бороться с врагом, о которым ты ничего не знаешь? К счастью, у меня был собственный опыт разработки спам-ботов под WordPress, и я немного в них всё-таки разбираюсь. Поэтому на основе своих соображений и описаний к способам борьбы со спамом я начал тестировать различные варианты. Далее опишу вам реально работающий метод, который настроен на этом блоге.

Эффективный способ защиты от автоматического спама в комментариях без каптчи

Я сразу же отказался от каптчи, так как мне этот метод совсем не нравится. Капча раздражает читателей, а хорошие спам-боты без особого труда её обходят. Стандартный для WordPress плагин akismet меня не устроил способом фильтрации спам сообщений. Комментаторы отсеиваются по IP на основе статистики от пользователей плагина. Если комментарий несколько человек отмечают как спамный, то IP-адрес комментатора помещается в базу плагина, и затем на других сайтах комментарии с такого IP автоматически отфильтровываются в папку для спама. Иногда такая схема даёт сбои, поэтому папку со спамом приходится периодически проверять руками, чтобы случайно не удалить полезные сообщения.

Потом я в Сети нашёл более интересный метод защиты от спама. Дело в том, что спам-боты напрямую обращаются с помощью POST-запроса к странице wp-comments-post.php. В своём запросе они используют стандартные имена полей формы комментирования: author, email, url, comment и comment_post_ID. А идея метода состоит в том, чтобы создать на странице два поля ввода комментария. Поле со стандартным именем мы спрячем от глаз пользователя с помощью средств CSS. Таким образом, реальный человек сможет заполнить только нестандартное поле, а спам-бот на страницу поста не заходит и не видит никаких изменений, нашёл стандартное поле и рад этому. Далее мы на автомате отфильтровываем сообщения, для которых заполнено поле со стандартным названием. Вот такой получился простой, но изящный подход к борьбе со спамом в комментариях к статьям.

Как это всё реализовать? Довольно легко. Если у вас современная тема WordPress, то вам нужно будет добавить несколько строк кода в файл functions.php и style.css.

Шаг 1:

а) На блоге используется современная тема, и форма для комментирования выводится с помощью функции comment_form():

// Adding a nospam field
add_filter('comment_form_defaults', 'change_comment_form_defaults');
function change_comment_form_defaults($default) {
    $commenter = wp_get_current_commenter();
    $comment_field = '<p class="comment-form-human-comment">
    <label for="human-comment">'. _x( 'Comment', 'noun' ) .'</label><textarea id="human-comment" 
    aria-required="true" rows="8" cols="45" name="human-comment"></textarea>
    </p>';
    $default['comment_notes_after'] = $comment_field . $default['comment_notes_after'];
    return $default;
}
// End adding a nospam field

б) На блоге используется старая тема, и форма для комментирования выводится непосредственно в файле шаблона comments.php. Тогда нужно в файле comments.php заменить строчку:

<textarea id="comment" class="textarea" name="comment"></textarea>

на две строчки:

<textarea id="comment" style="display: none;" name="comment"></textarea>
<textarea id="human-comment" class="textarea" name="human-comment"></textarea>

Готово. Теперь у нас два поля для ввода текста комментария comment и human-comment.

Шаг 2:

Поле со стандартным именем мы должны скрыть, чтобы оно не мешало пользователям и не портило внешний вид блога. Для этого в файл темы style.css нужно добавить следующий код:

#comment {
	display: none;
}

Также по желанию можно настроить внешний вид нового поля. Я просто класс нового поля добавил перечислением в свойства старого, чтобы всё выглядело как и до внесения изменений.

Шаг 3:

Далее в файл  functions.php скопируем код фильтрации автоматических комментариев, для которых заполнено старое невидимое для людей поле ввода:

add_filter('pre_comment_on_post', 'verify_spam');

function verify_spam($commentdata) {
  $spam_test_field = trim($_POST['comment']);
  if(!empty($spam_test_field)) 
  wp_die('Спаму нет!', 'Обратите внимание', array('response'=>500, 'back_link'=>true, 'text_direction'=> 'ltr'));
  $comment_content = trim($_POST['human-comment']);
  $_POST['comment'] = $comment_content;	
  return $commentdata;
}

В коде выше мы добавили к теме специальный hook (по русс. «крючок») — это специальные функции, которые позволяют настраивать поведение и работу стандартных функций WordPress на усмотрение пользователя. Перед отправкой комментария на добавление в базу данных мы проверяем, заполнено ли невидимое поле. Если оно заполнено, то это спам, и работа WordPress прекращается с ошибкой и специальным сообщением для спамеров.

Обновление от 06.04.2017. Несколько дней назад обнаружил, что перестали добавляться комментарии на блог. Оказалось, что ещё в версии WordPress 4.4.1 в январе 2016 года разработчики значительно переписали код файла wp_comments_post.php и фильтр pre_comment_on_post потерял свою актуальность.

Исправить проблему можно несколькими способами, теперь в общем нужно обрабатывать переменные POST запроса до файла wp_comments_post.php. Например, можно на JS менять обработчик формы комментариев на свой файл, в котором предварительно фильтровать переменные в POST массиве, а дальше подключать через include wp_comments_post.php.

Я выбрал другой вариант. Добавить тот же самый хук к другому экшену, например init, далее нужный код.

// Verify spam
add_action( 'init', 'verify_spam' );
function verify_spam() {
	if($_SERVER['SCRIPT_NAME'] == '/wp-comments-post.php') {
		$spam_test_field = trim($_POST['comment']);
		if(!empty($spam_test_field)) wp_die('Ваш комментарий похож на спам!', 'Обратите внимание', array('response'=>200, 'back_link'=>true, 'text_direction'=> 'ltr'));
		$_POST['comment'] = trim($_POST['human-comment']);;
	}
}
// End verify spam

Если заполнено только новое видимое поле, то комментарий отправляется на стандартную обработку и добавляется в базу данных блога.

Обратите внимание на то, что новое поле ввода у меня имеет название «human-comment» в Интернете вы можете встретить примеры кодов с «real-comment» — сути это не меняет. Но я вам советую для своего блога придумать уникальное название поля ввода (можно даже случайный набор цифр). Зачем это нужно? Чтобы усилить защиту от автоматического спама. Если на большом количестве блогов будет использоваться одно и то же название поля, то спамерам не составит большого труда перенастроить своих ботов и успешно продолжить своё серое дело. Но уникальные названия полей значительно затруднят такую процедуру и сделают её экономически невыгодной.

Этот метод позволил мне полностью избавиться от автоматического спама, и освободить дополнительное время на реализацию своих новых проектов и задумок.

Альтернативные способы защиты от спама в комментариях

  1. Плагин Akismet поставляется в стандартной сборке WordPress. Кроме недостатков перечисленных выше, у этого плагина есть ещё один. После удаления спам-комментария в БД остаются его мета-данные, которые её с течением времени сильно «раздувают». Возможно в свежих версиях плагина эту особенность уже исправили, не проверял, не знаю.
  2. Различные готовые плагины и виды каптчей. Например, Recaptcha или плагин antispam-bee. Каптча меня раздражает, а лишние плагины повышают нагрузку CMS на хостинг.
  3. Переименование одного из полей в форме для добавления комментариев. Это не совсем эффективный метод, многие боты его к сожалению успешно обходят.
  4. Переименование файла wp_comments_post.php. Не очень эффективный метод, спамеры умудряются его обойти, скорее всего, предварительно парсят значение action в форме комментариев. Также этот метод предполагает внесение изменений в код движка блога, что не есть хорошо, так как при последующем обновлении все изменения придётся вносить заново.
  5. Различные методы, в основе которых применяется JavaScript. Часто они неэффективны и только создают проблемы для пользователей, которые зашли на ваш сайт с отключённым JS (или их браузер элементарно не поддерживает выполнение JS).
  6. Премодерация комментариев. Со спамом в любом случае придётся разбираться в ручную. Также метод не подойдёт для популярных проектов, на которых ведутся активные дискуссии, так как придётся непрерывно принимать или отклонять свежие сообщения, чтобы не нарушать ход разговора между посетителями.

Добавлю ещё несколько плюсов описанного в статье метода защиты от автоматического спама.

  • Бесполезные комментарии отклоняются ещё на этапе обработки, они не заполняют БД и не расходуют ресурсы хостинга.
  • Защитный код легко внедряется в тему и имеет минимально необходимые настройки и функциональность.
  • Сама идея с успехом может применяться не только на WordPress, но и на других популярных движках — универсальный способ борьбы с автоматическим спамом.

После включения защиты от спама мне за месяц не пришло ни одного автоматического спам-комментария. Даже блог грустно как-то стало вести. Реальные посетители меня тоже почему-то не хотят порадовать :-).

4 thoughts on “Защита от спама в комментариях без плагинов”
  1. Напишите, пожалуйста, подробнее — куда добавить приведенный код, тоже перестал работать акисмет, вот захожу я в админку вордпресса и что сделать дальше?

    1. Подобный PHP код обычно добавляется в файл functions.php вашей темы. Если править через админку, то Внешний вид -> Редактор и выбираете нужный файл.
      CSS стили можно добавить в файл темы style.css.
      Предварительно желательно сделать бэкап файлов, чтобы быстро восстановить сайт в случае ошибок.

    1. Возможно и так. Я на авторство идеи не претендую. Сам в Интернете нашёл, внедрил и описал свой опыт использования. Способ точно эффективно помогает от автоматического спама.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *