Flector

Как защититься от спама с помощью подмены полей?

Сообщение для спаммеров

Предлагаю вам воспользоваться уже давно известным и проверенным способом защиты от спама через подмену полей. В чем он заключается? В создании дополнительного поля для ввода комментария с одновременным скрытием стандартного поля. Спам-скрипты пытаются заполнить скрытое стандартное поле с именем 'comment' и в результате не проходят проверку. Данный способ с подменой полей успешно работает уже более 10 лет, так как спаммерам лень писать "умные" скрипты, которые могли бы изображать из себя реального человека. Для этого вам необходимо добавить в файл functions.php вашей темы следующий код:

//добавляем поле 'real-comment' start
function wph_add_new_comment_field($args) {
 
  if (preg_match('/<textarea.*textarea>/', $args['comment_field'], $match)){
    $textarea = $match[0];
    $real_textarea = str_replace('comment', 'real-comment', $textarea, $count);
 
    if ($count) {
        $hidden_textarea = str_replace( '<textarea', 
        '<textarea style="display:none;"', $textarea );
        $hidden_textarea = str_replace( 'required="required"', 
        '', $hidden_textarea );
        $hidden_textarea = str_replace( 'aria-required="true"', 
        '', $hidden_textarea );
        $args['comment_field'] = str_replace($textarea, 
        "$hidden_textarea$real_textarea", $args['comment_field']);
    }
  }
  return $args;
}
add_filter('comment_form_defaults', 'wph_add_new_comment_field', 30);
//добавляем поле 'real-comment' end
 
//проверка на спам start 
function wph_verify_spam() {
    if(false === strpos($_SERVER['REQUEST_URI'], 'wp-comments-post.php'))
        return; 
    if(!empty($_POST['comment']))
        wp_die('Спаму нет!');
 
    $_POST['comment'] = $_POST['real-comment'];
}
add_filter('init', 'wph_verify_spam');
//проверка на спам end

Проверить работу данного хака очень легко: удалите из первой функции display:none; и обновите страницу. Вы увидите 2 одинаковых текстовых поля для ввода комментария. Заполните первое поле и попробуйте опубликовать комментарий. У вас ничего не получится, так как движок выдаст вам сообщение "Спаму нет!". В чем недостаток данного метода? В том, что он требует правки плагинов, которые работают с комментариями (в них надо заменить 'comment' на 'real-comment'). Если же вы не пользуетесь какими-либо дополнительными плагинами для комментариев, то данный способ защиты от спама будет для вас идеален.

Чем такая защита от спама лучше плагинов вроде Akismet? Тем, что автоматический спам до вас не будет доходить вообще. И вам не надо будет разгребать тысячи спамных комментариев, чтобы найти какой-нибудь комментарий, который Akismet отметил как спам по ошибке. Я пользуюсь методом подмены полей на всех своих сайтах (и на этом сайте тоже) уже более 10 лет и я уже давно не считаю спам какой-либо серьезной проблемой, чего и вам желаю.

За корректный код, работающий с WordPress 4.4 и выше огромное спасибо Тимуру.


Комментарии (24 комментария)
  1. Влад:

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

    • Flector:

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

      вы даже в инспекторе кода можете посмотреть, что поле для комментариев тут называется "real-comment", а не "comment".

      если у вас что-то не работает - значит сделали криво.

      • Влад:

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

        • Flector:

          ну, например, у вас может быть очень старая тема, где форма комментирования выводится вручную - этот код работает только с относительно новыми темами (нужная функция появилась в движке wordpress 3.0).

          далее, некоторые темы сами исправляют форму комментирования, в этом тоже может быть проблема.

          дайте ссылку на сайт лучше, я посмотрю в чем дело.

  2. Влад:

    тема свеженькая. ну посмотрите, хотелось бы все-таки избавиться от спама, уже надоел капитально, когда увидел вашу статью, так обрадовался, а потом когда не сработало, разочаровался.
    https://crypto-info.ru/

    • Flector:

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

      107
      
      'comment_field' => '<p class="comment-form-comment"><textarea id="comment" name="comment" cols="45" rows="8" aria-required="true"></textarea></p>',

      на

      107
      
      'comment_field' => '<p class="comment-form-comment"><textarea  style="display:none;" id="comment" name="comment" cols="45" rows="8"></textarea></p><p class="comment-form-comment"><textarea id="real-comment" name="real-comment" cols="45" rows="8" aria-required="true"></textarea></p>',

      и, собственно, все. хак будет работать.

      • Влад:

        Flector, спасибо за помощь, теперь все работает! Буду следить за вашим сайтом, много полезного почерпнул

  3. Влад:

    и извините за граматея ))

  4. Баблоруб:

    блин, все так хорошо работало, но сегодня обновилась тема, и в comments.php уже нету такой строчки (( и коменты не проходят. а так метод был шикарен-до него не успевал отмахиваться от спама

    • Flector:

      какой строчки то?
      данный код не требует никаких строчек.

      дайте ссылку на вашу тему, я посмотрю в чем там дело.

      • Баблоруб:

        cсылка есть в комментарии выше от влада. там тема специфическая.

        • Flector:

          там ссылка на сайт, а не на тему.

        • Баблоруб:

          Тема generatepress 2.0

        • Flector:

          слушайте, вы издеваетесь?

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

  5. Баблоруб:

    Я видел, что она спустилась и изменилась. Но я не знал, что все равно подойдёт старый код

    • Flector:

      да не важно, что там написано. тема переопределяет стандартные значения движка, а мы переопределяем своим значением их значение.

  6. Андрей:

    Интересный способ. На ходу в голову пришел еще один способ - сделать замену полей и если будет спам, то, например, текст в поле имя будет очень длинный и если текст там окажется длинным, то комментарий не пройдёт. Как сделать что-нибудь подобное?

  7. Валерий:

    Доброго времени суток, Flector.

    Возможно вас заинтересует идея борьбы со спамом описанным ниже способом и вы опубликуете новую статью с кодом, реализующим сие.
    Спамерские сообщения в 98% случаев содержат ссылку, начинающуюся на (http или https). Было бы прекрасно при наличии этих «стоп слов» в отправляемом комментарии выводить страницу, на которой необходимо подтверждение посредством установки галки " Гугл Рекапча", дабы сообщение было отправлено далее (на модерацию, публикацию). А в остальных случаях (в отсутствии стоп слов) комментарий отправлялся как и обычно.
    А то хоть и стоит Акисмет, но папка со спамом наполняется всё равно. Отключить не могу из-за того, что туда хоть и редко, но попадают сообщения и от реальных пользователей. Вот и приходится просматривать весь этот мусор. А с описанным способом проблема будет решена вообще полностью. И при этом никаких дополнительных препятствий не создастся для 90% комментаторов, а оставшиеся 10% (которые отправляют коммент со ссылкой) поставят галочку на странице-заглушке с капчей, благо коммент то уже написан.
    Думаю, что не стоит говорить, что потенциальные комментаторы бывают ленивые, и видя капчу под формой комментов, уже могут отказаться от идеи написать комментарий.

    • Flector:

      а зачем столько лишних телодвижений?
      описанный в статье способ отсеивает спам на 99.99% и без всяких страниц заглушек.

      • Валерий:

        Он не стандартен, наверняка будут проблемы, если используется Акисмет и\или плагин для подписки на комментарии...

        • Flector:

          с акисметом проблем нет. плагин подписки нуждается в корректировке поля 'comment', это да.

  8. Antispam Bee плаги помоему то же самое делает ))

Написать комментарий

Для вставки кода воспользуйтесь кнопкой "Код". Используйте предпросмотр!