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

Как я wordpress комментарии от спама защищал

Понравилась статья? Оставьте оценку:

  1. 5
  2. 4
  3. 3
  4. 2
  5. 1
(1 голос, в среднем: 5 из 5)

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

Часть первая. Стандартные процедуры

Первое что напрашивается — это капча. Но так ли она нужна? Ведь не каждый посетитель станет разбирать непонятные циферки на картинке, пытаясь запостить фидбэк на сайт. Попробуем защититься от спама в комментариях без установки капчи. Речь пойдет о CMS WordPress, но собственно идею можно применить на любом сайте.

Итак начнем. Добавим в форму комментов проверку на nonce. Удивительно, но по умолчанию она не содержит этого. На подопытном сайте форма выводится с помощью стандартного comment_form($args);

Поэтому напрямую запилить nonce поля в нее невозможно. Необходимо использовать экшн. Добавим код в functions.php:

function add_more_fields () {
    wp_nonce_field('my_comment_nonce_value', 'my_comment_nonce');
}
add_action('comment_form_after_fields', 'add_more_fields' );

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

<form class="comment" action="блабла">
<!-- тут поля формы -->
<?php wp_nonce_field('my_comment_nonce_value', 'my_comment_nonce'); ?>
</form>

После этих манипуляций форма комментариев должна содержать специальные проверочные wordpress инпуты:

<input id="my_comment_nonce" name="my_comment_nonce" value="123456" type="hidden">
<input name="_wp_http_referer" value="/url/" type="hidden">

Кстати, да, я не буду рассказывать что такое nonce. Вкратце — это специальные поля для проверки того факта, что запрос пришел не «извне» а именно с нашего ресурса.

Теперь эти поля необходимо проверить. то есть во время публикации комментария незарегистрированным пользователем — получить эти поля в POST запросе, и, используя специальную функцию вордпресса, верифицировать. Снова открываем functions.php и пишем новый экшн.

/*
 * Проверяем POST запрос на наличие nonce полей
 */
function my_nonce_comment_validation($comment_data) {
    if(!isset( $_POST['my_comment_nonce'] ) || !wp_verify_nonce( $_POST['my_comment_nonce'], 'my_comment_nonce_value' ))
        exit;
    else
        return $comment_data;
}
add_filter('preprocess_comment', 'my_nonce_comment_validation');

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

Часть 2. Усиление защиты.

В общем и целом поток спама сократился практически вдвое. Но этот результат меня совсем не устраивает, ибо спама все равно много. Поразмыслим. Мы добавили проверочное поле в форму, но его все равно более продвинутые спамилки могут найти и использовать. Ну чтож. В таком случае мы несколько скроем эти поля, а верней уберем их из формы совсем. Даже не так, в форме мы сформируем «подставное», неправильное значение. А правильное — добавим в JS код… А затем после загрузки страницы выполним этот JS код, который «скопирует» верное нонсе-значения в форму. Вот это хитрость!

// Это мы убираем:
function add_more_fields () {
    wp_nonce_field('my_comment_nonce_value', 'my_comment_nonce');
}
add_action('comment_form_after_fields', 'add_more_fields' );

И заменяем на вот это:

function add_more_fields () {
    // Выводим в форму подставные неверные поля
    echo '<input type="hidden" id="my_comment_nonce" name="my_comment_nonce" value="66c771fbe6"';
    echo '<input type="hidden" name="_wp_http_referer" value="/" />';
}

Далее откроем файл footer.php и в самом низу, перед закрывающим тегом body напишем наш хитрый скрипт:

<script type='text/javascript'>
    (function ($) {
        $("input[name=my_comment_nonce]").each(function(){
            var nonce = "<?php echo wp_create_nonce("my_comment_verify"); ?>";
            $(this).val(nonce);
        });
        $("input[name=_wp_http_referer]").each(function(){
            var referer = "<?php echo $_SERVER['REQUEST_URI']; ?>";
            $(this).val(referer);
        });
    })(jQuery);
</script>

Важно: библиотека jQuery должна быть уже подключена, чтобы наш скрипт отработал правильно. В скрипте с помощью вставки PHP кода формируются правильные nonce-значения, которые с помощью jQuery вставляются в те «подставные» поля что мы описали ранее. Скрипт, отвечающий за проверку, переделывать не нужно, он остается таким как был.

Такая «защита» уже будет не по зубам простым спамилкам, но есть один минус. Пользователи с отключенным JS не смогут оставить комментарий. Хотя таких и очень немного. Да и та же капча от гугла, также использует джаваскрипт…

 

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