Как избавиться от спама в комментариях WordPress за 5 минут (без капчи и без плагинов)

18 Июнь, 2015

Здравствуйте, уважаемые читатели блога KtoNaNovenkogo.ru. Небольшой пост из серии «а ларчик просто открывался». Последние года четыре для защиты от спама в комментариях своего блога на WordPress я с успехом использовал довольно-таки редкий плагин DCaptcha. Однако в последнее время он стал пропускать спамм — с каждым днем все больше и больше. В связи с чем пришлось искать ему замену, ибо вручную удалять сотни спаммных комментариев не очень улыбалось.

Спамм в WordPress

Почитал про разные имеющиеся на рынке плагины — как с капчей, так и без нее. И по ходу дела несколько раз наткнулся на описание того способа избавления от спама в WordPress, который в итоге и применил. У него есть ряд преимуществ и всего один недостаток — придется чуток покопаться в коде (но самую малость). Зато в результате получаете рабочий вариант спаморезки, без надоедливой капчи и без создания дополнительной нагрузки на блог за счет установки плагина.

Как направить спам-ботов по ложному пути?


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

Однако, робота этого можно попытаться обмануть в той области, где не шибко искушен. Главное, чтобы он считал, что с успехом выполнил свою работу — распространил спам по страницам вашего блога. Для обмана мы добавим на сайт еще одну форму для ввода текста комментария. Если их будет две, то какую выберет робот для добавления поста? Правильно, скорее всего, первую. Тут ведь действует та же логика, что и в ироничной миниатюре про два девятых вагона, когда все логично считали, что 9 вагон это тот, который следует сразу после 8, а не тот, что находится перед 10.

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

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

Итак, чтобы все это дело реализовать на практике, большого ума не надо. Однако, по традиции, советую вас сделать резервную копию файлов и базы данных, чтобы можно в случае форс-мажора из них восстановиться. Все файлы, которые нам понадобятся, находятся в папке с используемой вами темой оформления (/wp-content/themes/имя_темы). Лучше использовать ФТП-клиент, чем редактировать эти файлы через админку WordPress, ибо во втором случае у вас могут возникнуть проблемы с отменой внесенных изменений.

Самодельная спаморезка в теме оформления WordPress


Для начала нужно будет найти в файлике comments.php участок кода, который отвечает за вывод на страницы постов поля для добавления комментариев. Если вы изучали когда-либо Html формы, то поймете назначение тега textarea, который нам и нужно будет найти в коде файла comments.php. Если его там не окажется, то значит у вас иное устройство темы, чем у меня и, скорее всего, форма для оставления комментария формируется с помощью специальной функции. В этом случае порядок действий будет чуток другой.

Однако, мы будет считать, что вы таки нашли строку с textarea, которая выглядеть будет примерно так:

<textarea name="comment" id="comment" cols="0" rows="0" tabindex="4" class="textarea1"></textarea>

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

<textarea name="comment" id="comment" cols="0" rows="0" tabindex="4" class="textarea1"></textarea>
<textarea name="struktura" id="struktura" cols="70" rows="10" tabindex="4" class="textarea1"></textarea>

Если заметили, то я во второй строке заменил name="comment" id="comment" на name="struktura" id="struktura". Вы должны сделать то же самое, но только вместо struktura использовать можно все, что угодно (потом просто замените это в коде фильтра приводимого чуть ниже).

Понятно, да? Мы таким образом создали вторую форму для ввода комментария (если сохраните сейчас произведенные изменения, то увидите в реале две этих формы на своем блоге). Первая из них будет «пустышкой» для наивных спам-роботов (мы ее сейчас спрячем от глаз пользователей), а вторая будет рабочей формой, которой и будут пользоваться ваши комментаторы, ибо ничего другого они и не увидят.

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

#comment {display:none;}

После чего первая (фиктивная) форма для комментариев исчезнет со страниц вашего блога на WordPress. Все просто, но мне тут нашептали, что display:none следует избегать из-за опасений навлечь немилость поисковиков (не знаю оправданы ли эти опасения) — типа вы что-то скрываете, делая часть сайта невидимой для посетителей (некий отдаленный аналог клоакинга получается).

Поэтому я чуток все для себя усложнил и добавил несколько CSS правил в style.css вместо приведенного выше одного:

textarea#struktura {margin-top:-60px;overflow:hidden; }
textarea#comment input {margin-top:10px;}

Таки образом я наехал второй формой на первую и полностью скрыл от глаз посетителей «пустышку», чтобы они ничего в нее не могли добавить. Если что-то не понятно, что читайте про margin-top и overflow:hidden.

Итак, нужного визуального эффекта мы добились. Осталось еще добавить фильтр, который бы отключал добавление комментариев через первую (основную по умолчанию) форму и передавал бы ее полномочия второй форме, которая будет доступна посетителям. Для этого нужно будет открыть файлик functions.php (архиполезный) и добавить в него (аккуратно, чтобы не поломать уже имеющийся там код) этот фильтр (не забудьте заменить struktura на то, что использовали вы):

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('спам');
  $comment_content = trim($_POST['struktura']);
  $_POST['comment'] = $comment_content;
  return $commentdata;
}

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

Удачи вам! До скорых встреч на страницах блога KtoNaNovenkogo.ru

Подборки по теме:

Комментарии и отзывы

MadFox.name

Ну если seonly не отписался то схема рабочая 😀

Григорий

Спасибо за идею, нужно попробовать у себя в блоге так сделать

ros

Было дело, пробовал. Часть ботов действительно отсекается, но полностью вопрос не решился, иногда спам появлялся. Дополнительно добавил капчу, причем самую простую типа

«25 плюс пять», пока вроде норм.

Думаю это от умности бота зависит, дешевые боты можно отсеять простыми методами, но дорогие вряд ли.

Кай

день добрый, в нужное время нужная статья.:-)

Есть пара вопросов:

Проверка валидности кода не выдает никаких ошибок?

Поисковики не будут ругаться на наличие двух форм контактов... они ведь тоже боты и могут как-то не правильно реагировать.:-)

Alex Abramov

Элегантное решение! Ай, спасибо автору!

А как быть тем, у кого на страницах блога форм нет, а спам на модерацию поступает?

Я не нашёл пока способа избавиться от такого спама. 🙁

Алексей

Может кто знаете как побороть реферальный спам, может плагин есть для wordress или чёрный список какой нибудь?

red-nail

странно, акисмет все прекрасно рубит. Почему не использовать его?

Владимир

Использовал всегда невидимую капчу для вордпресс.

Ни разу не подвела.

Так же хороший вариант cleantalk. Его использую как защиту от спамных регистраций.

Павел

Ваш метод — полная ерунда!

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

Так что решение нужно искать и делать не в «хитром» создании костылей с «элегантен и прост в понимании», а в тотальной обрезке всех путей доступа спам-ботов к вашему сайту.

Блокировка на 403 ошибку через либо ручное добавление, либо полу-автоматическое в htaccess

Артём

Здравствуйте Дмитрий! Давно использую ваш блог как руководство. Позвольте вопрос: начал изучать вордпресс и вот что интересно — как мне сделать такую же форму комментариев как у вас, т.е. без графы «сайт»? Да причем мне нужен английский вариант блока «комментарии», т.е. не имя, а name и т.д. Если ответите, то буду весьма благодарен. Спасибо.

Подписаться не комментируя