Борьба со спамом в комментариях на WordPress

27 февраля 2011. Рубрики: Интернет, Рабочие заметки; автор — Юлия Панина aka Княгиня.

Два самых надёжных и испытанных мной метода

Уважаемые владельцы блогов на Wordpress! Если вы ещё не столкнулись со спамом в комментариях, значит, вас пока просто не заметили. И обязательно заметят и заспамят, если только вы не будете прятать свой блог от людей. Но, скорее всего, вы с этой напастью уже знакомы. Так что хотите мирной жизни — готовьтесь к войне. И готовьте оружие/средства защиты, потому что WordPress своими средствами со спамом не справляется. И помните, что в борьбе со спамом необходимо не только отбить спамеров, но и сохранить живых пользователей живыми.

Итак, что мы имеем?

  • К сожалению, такие популярные методы как капча или поголовная регистрация безупречно отсекают спам, но создают проблемы живым людям, так что эти способы надёжны, но дают болезненный побочный эффект.
  • То же самое можно сказать про премодерацию, ибо при большом количестве посетителей она изнурительна для хозяина блога.
  • Средства, подобные Aksimet, не отсеивают начинающих спамеров.
  • Удаление поля «Url» из формы комментирования вообще бесполезно, потому что большинство ботов не обращаются к странице комментирования, так что спамеров вы будете отличать по наличию заполненного поля «Url».
  • Использование «nofollow» спамеров не отпугивает, так же как и грозные предупреждения: боты неграмотны и просто их не замечают.

В общем, куда ни кинь, везде клин, то есть, либо проблема не решается, либо взамен появляются другие.

Однако два с лишним года назад я нашла способ, отлично отсекающий спамеров без ущерба как для пользователей, так и для меня лично. Если кратко, то суть его в том, чтобы подменить имя (name) одного из стандартных полей формы комментирования WordPress. Опытный преступник спамерский бот передаёт серверу типовой набор полей со стандартными именами и получает отлуп, а честный пользователь заполняет форму на странице с теми именами, которые используются на вашем блоге, и спокойно отправляет комментарий.

В последних версиях WordPress метод в таком виде не работает; используйте обновлённую версию.

Собственно, рецепт. В папке с файлами темы ищем comments.php, а в нём находим поле комментария:

<textarea name="comment" id="comment" cols="61" rows="13"></textarea>

Код может отличаться наличием дополнительных атрибутов, поэтому при поиске ориентируемся на textarea. Заменяем этот код на:

<textarea name="comment" id="comment" cols="1" rows="1"></textarea>
<textarea name="newName" id="newName" cols="61" rows="13"></textarea>

А в css добавляем код:

#comment{
  display:none;
}

Просто удалить поле с именем «comment» нельзя — оно должно присутствовать в коде html и отвлекать внимание ботов, поэтому его надо спрятать.

Далее идём в корень сайта и находим файл wp-comments-post.php. В нём делаем заменяем код:

$comment_author = trim(strip_tags($_POST['author']));
$comment_author_email = trim($_POST['email']);
$comment_author_url = trim($_POST['url']);
$comment_content = trim($_POST['comment']);

на:

$spam_test_field = trim($_POST['comment']);
if(!empty($spam_test_field)) wp_die('NO SPAM!');
$comment_author = trim(strip_tags($_POST['author']));
$comment_author_email = trim($_POST['email']);
$comment_author_url = trim($_POST['url']);
$comment_content = trim($_POST['newName']);

Теперь при попытке заполнить стандартное поле с именем comment вместо отправки комментария будет выдаваться предупреждение «NO SPAM!».

До того, как я применила этот метод, спамеры шли косяком, вызывая у меня всяческие кровожадные мысли; после подмены поля их словно отрезало. Надолго. Остались лишь немногочисленные спамеры-ручники и полуручники.

Правда, у этого метода есть недостаток: при обновлении версии WordPress файл wp-comments-post.php затирается и правку придётся повторять каждый раз. Если этого не сделать, движок будет искать поле с именем comment, а при его незаполненности давать отлуп живым комментаторам. Поэтому ставим эту операцию в список задач при обновлении.

В дополнение к этому средству можно вообще запретить ботам обращение к форме комментирования. Представляю рецепт от автора: 20+ правил .htaccess, которые должен знать каждый разработчик (смотрим правило №19, «Запрещаем комментарии от пользователей без Referrer»). Правда, особо ушлые боты научились отдавать реферер, поэтому отказываться от первого способа тоже не стоит.

Суть метода в том, чтобы запретить отправку комментария тем посетителям, которые напрямую к файлу wp-comments-post.php. Такое поведение характерно для спам-ботов: живой пользователь сначала заполняет форму на странице сайта, а бот эту стадию минует. Чтобы отсечь «торопыжку», пишем в .htaccess такой код:

#Запрещаем комментарии от пользователей без Referrer
RewriteEngine On
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} .<span>wp-comments</span>-post\.php*
RewriteCond %{HTTP_REFERER} !.*Yourblog.com.* [OR]
RewriteCond %{HTTP_USER_AGENT} ^$
RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]

«Yourblog.com» меняем на доменное имя своего блога! И не забываем собственноручно протестить добавление комментария.

Могу засвидетельствовать: после применения этого метода автоматический спам отрезало начисто. Чего и всем желаю.

Отзывы (67) на «Борьба со спамом в комментариях на WordPress»
  1. RY (1 комментарий)

    Хороший пост. Урл с 20-ю правилами добавил в закладки.

    Ответить на этот комментарий
    • Княгиня (648 комментариев)

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

      Ответить на этот комментарий
  2. Евгений (1 комментарий)

    Так, по моему, плагин Akismet с этим отлично справляется. Или я ошибаюсь?

    Ответить на этот комментарий
    • Княгиня (648 комментариев)

      Аксимет в статье упомянут. Он:
      а) засоряет корзину отбракованными комментами;
      б) ловит только засвеченных спамеров.

      Ответить на этот комментарий
  3. zhivcheg (5 комментариев)

    спасибо, очень рассчитываю на ваш метод, блог молодой, практически кроме спама ничего не льется, порой 30-40 комментов. Eсли поможет обязательно напишу про ваш способ с ссылочкой на сатью.

    Ответить на этот комментарий
    • Княгиня (648 комментариев)

      На здоровье.

      P.S.У Вашего блога на разрешении 1024х768 появляется горизонтальная прокрутка, без которой вполне можно обойтись (подвал широковат). Без неё он будет лучше.

      Ответить на этот комментарий
      • zhivcheg (5 комментариев)

        это был первый мой сайт сейчас за него уже немного стыдно) в данный момент собираюсь делать полный редизайн.
        К сожалению ваш метод не решил проблему или решил не полностью, скорее всего после редизайна буду искать альтернативные методы.

        Ответить на этот комментарий
        • Княгиня (648 комментариев)

          а) до какой степени «не решил»?
          б) вы всё правильно сделали? И отправку комментов после этого потестили (при неправильной настройке они могут стать совсем неотправляемыми)?

          Ответить на этот комментарий
  4. zhivcheg (5 комментариев)

    комментарии работают. Вроде сделал все как Вы сказали, теперь .htaccess выглядит
    так

    Ответить на этот комментарий
    • zhivcheg (5 комментариев)

      а спам как валил так и валит причем преимущественно зарубежный, так и не знаю как с ним бороться

      Ответить на этот комментарий
    • Княгиня (648 комментариев)

      «На ощупь» ничего конкретного сказать не могу. Но у меня оба блока (первый блок у вас для ЧПУ) находятся внутри <ifmodule mod_rewrite.c> и идут в обратном порядке (это связано с очерёдностью обработки; да и мой htaccess намного больше).

      Попробуйте изменить порядок правил. Если это не помогает, попробуйте первый метод, с подменой имени поля. А если не будет работать и он, значит, спам идёт в ручном или полуручном режиме. Против такого ничего не придумано. (Хотя странно, конечно, чтоб в таком количестве, на молодой блог и вручную.)

      Ответить на этот комментарий
  5. zhivcheg (5 комментариев)

    то что вручную вряд ли, комментариев за сутки порядка 50-60 а посещаемость 15-20, в любом случае спасибо за совет.

    Ответить на этот комментарий
    • Княгиня (648 комментариев)

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

      Попробуйте оба способа. Только первый требует восстановления при каждом обновлении движка: wp-comments-post.php при этом затирается.

      Ответить на этот комментарий
    • Княгиня (648 комментариев)

      Провела небольшое исследование. Есть боты, отдающие реферер. Соответственно, их htaccess’ом не отобьёшь. Видимо, это как раз ваш случай. Пробуйте подменить поле по первому способу.

      Ответить на этот комментарий
  6. Vladimir (3 комментария)

    Только первый требует восстановления при каждом обновлении движка: wp-comments-post.php при этом затирается.

    wp-comments-post.php можно не править. Написать плагин, который по событию wp_init (или plugins_loaded) проверяет $_SERVER[‘PHP_SELF’]. Если оно оканчивается на /wp-comments-post.php, то выполнить нужные проверки и если всё в порядке, то сделать $_POST[‘name’] = $_POST[‘my_secret_name’]. Как-то так.

    Ответить на этот комментарий
    • Княгиня (648 комментариев)

      Я слышала, что уже есть полноразмерный плагин для WordPress, который не надо писать самому, а скачать и установить. Но мне было влом искать. Мне проще поправить wp-comments-post.php по накатанной дорожке.

      Ответить на этот комментарий
  7. vovans (9 комментариев)

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

    Ответить на этот комментарий
    • Княгиня (648 комментариев)

      На данный момент защита, описанная в статье, отсеивает весь автоспам на моих блогах. Для ручного спама — последнее китайское предупреждение при комментировании и премодерация первого комментария. Akismet отключила, потому что он периодически банит честных юзеров.

      Ответить на этот комментарий
      • vovans (9 комментариев)

        Странное дело. Блог в подписи не такой уж и новый. Посетителей порядка тысячи в день, читателей rss в полтора-два раза больше. Из защиты от спама простенькая каптча. Комментарии добавляются без премодерации. Спама нет вообще. Ни одного комментария за всё время не припомню. Хотя нет, попытка одна была в гостевую.

        А вот что касается других CMS, то это просто беда какая-то (( посетителей единицы, спама же…

        Ответить на этот комментарий
        • Княгиня (648 комментариев)

          Капча — да, защищает от спама. Автоматического. Но и живым людям создаёт проблемы. Поэтому там, где можно, лучше обойтись без неё. Если не ставить целью допустить к комментированию лишь самых стойких. :)

          Ответить на этот комментарий
          • vovans (9 комментариев)

            Ну, если Вы смотрели на мою капчу, то заметили, что она очень простая. Кроме того, имеется автоматическая регистрация — указал ник и почту при написании комментария и ты уже постоянный пользователь. Я же не рекапчу прикрутил :-D

            А вообще, сейчас почитал, почитал по интернету… и думаю свой единственный блог перевесмти на ту же CMS, что и в подписи, плюс ко всему, пересмотреть полностью структуру сайта и его «идеи» )) Вордпресс больно утомителен. Ресурсов жрёт за пятерых, в обслуживании сложнее и прочее… В ощем, не стоит оно того. Хватило бы только духу ))

            Ответить на этот комментарий
            • Княгиня (648 комментариев)

              Не знаю, меня лично wordpress вполне устраивает. Не чувствую, чтобы он меня утомлял. В то же время не настолько сложен, чтобы звать кого-то на помощь. А ресурсы… Когда у меня будет по полторы тысячи человек в день, тогда посмотрим.

              Ответить на этот комментарий
              • vovans (9 комментариев)

                У меня же не один блог )) И вот остальные как-то не напрягают. А с вордпресовским вечно морока. С тем же спамом, например. Да и прочее. Не хочу вдаваться.

                И по ресурсам Вордпресс довольно аппетитный. Думаю, на 1 500 посетителей в день вордпресс загнул бы мой хостинг даже с кешированием. Ну, или в притык бы с требованиями был. Потому что даже в текущем состоянии из 50 единиц допустимой нагрузки в сутки сейчас 25-35. То есть, уже задумываюсь, что делать в ближайшем будущем :)

                Ну да ладно, это уже чат получается ;)

                Ещё раз спасибо за заметку!

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

Есть что сказать? Не молчим!

Используйте теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" code=""> <ul> <li> <ol> .

Комментарии короче 200 символов публикуются без активной ссылки. Пробелы не учитываются.

Ссылки с комментариев dofollow. Ознакомьтесь, пожалуйста, с правилами dofollow-комментирования. Кто не читает, тот сам себе враг.