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

Logo
Защита комментариев WordPress от спама без использования капчи

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

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

  1. Значения скрытых полей не статичны и генерируются на стороне клиента при помощи JavaScript.
  2. Вместо одного скрытого поля используются два.
  3. Проверка на спам происходит до записи комментария в базу дынных.

В отличие от плагина DCaptcha, где комментарии сначала заносились в базу данных, а затем удалялись в корзину, если проверка на спам не была пройдена, наш плагин осуществляет проверку заранее перед добавлением в БД. Таким образом, мы не нагружаем и не засоряем лишний раз базу данных сайта, что очень важно.

Скачать плагин можно по следующей ссылке.

Так будет выглядеть форма комментирования после активации плагина:

Плагин защиты от автоматического спама DD Captcha

С целью экономии времени, я решил назвать плагин по-простому – с использованием инициалов. Впрочем, название не играет никакой роли, кроме как для последующего поиска плагина в интернете, поэтому перейдем непосредственно к делу. Начнем с кода.

<?php
/*
Plugin Name: DD Captcha
Description: Добавляет поле защиты от спама "Это не спам" в форму комментариев.
Plugin URI: http://dmitriydenisov.com/category/wordpress/wp-plugins/dd-captcha.html
Author: Дмитрий
Author URI: http://dmitriydenisov.com
*/

add_action('preprocess_comment', "comment_post");
add_action('comment_form_after_fields', "add_captcha");

function comment_post ($commentdata) {
    global $user_ID;

    if ($user_ID) {
        return $commentdata;
    }

    if (!isset($_POST["captcha"]) || $_POST["captcha"] == '' || !isset($_POST["captcha_key"]) || $_POST["captcha_key"] == '' || $_POST["captcha"] != $_POST["captcha_key"]) {
        echo '<p style="text-align: center;">Вы забыли заполнить поле защиты от спама. Пожалуйста, вернитесь на предыдущую страницу и попробуйте еще раз.</p>';
        exit;
    }

    return $commentdata;
}

function add_captcha ($post_id) {
    global $user_ID;

    if ($user_ID) {
        return $post_id;
    }
    ?>
	<script type="text/javascript">
        jQuery(function ($) {
            // Prepare captcha
            $('#captcha_key').val(Math.floor((Math.random() * 999999) + 1));
            $('#captcha').val(Math.floor((Math.random() * 999999) + 1));
            $('#captcha_checkbox').removeProp('checked');

            // Captcha click
            $('#captcha_checkbox').on('click', function() {
                var captcha_key = $('#captcha_key').val();
                var captcha_id = $('#captcha');
                var captcha = captcha_id.val();
                var captcha_random = Math.floor((Math.random() * 999999) + 1);
                if (captcha == captcha_key) {
                    captcha_id.val(captcha_random);
                } else {
                    captcha_id.val(captcha_key);
                }
            });
        }); /* Document Ready */
    </script>
    <div id="comments_captcha" style="margin-top: 5px; margin-bottom: 5px;">
        <input type="checkbox" id="captcha_checkbox" value="" style="float: left; margin: 2px 5px 0 0;" />
        <label for="captcha_checkbox" style="color: #FF0000; vertical-align: middle;">Это не спам</label>
    </div>
    <input type="hidden" name="captcha" id="captcha" value="" />
    <input type="hidden" name="captcha_key" id="captcha_key" value="" />
    <?php

    return $post_id;
}

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

Генерация значений скрытых полей осуществляется посредством jQuery скрипта, который автоматически добавляется в код вместе со скрытыми полями. Исходя из этого, для корректной работы плагина необходимо, чтобы на сайте были подключены библиотеки jQuery. К счастью, на сегодняшний день довольно сложно найти сайт, не использующий jQuery, поэтому проблем с этим быть не должно.

Итак, вернемся к работе скрипта. Во время загрузки страницы jQuery скрипт автоматически генерирует значения для скрытых полей, а также снимает флажок защиты от спама при обновлении страницы. Когда мы отмечаем чекбокс «Это не спам», значения скрытых полей дублируются и форма готова к отправке. При съеме флажка, значение одного из полей генерируется заново и при отправке формы защита от спама пройдена не будет.

Как видите, данный способ очень простой, но весьма эффективный для защиты от автоматического спама, распространяемого посредством программ. Для обычных же людей, он создает минимум неудобств. Достаточно просто отметить чекбокс «Это не спам» и защита будет пройдена.

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

Обнаружили ошибку? Выделите ее и нажмите Ctrl+Enter

Комментарии 3

  • Николай

    Обход такой капчи прост: отправляем 2 одинаковых параметра (captcha и captcha_key), вместе с полями формы.

  • Дмитрий

    Никто и не говорит, что это сложно. Это элементарная защита от автоматического спама. Тем не менее, она достаточно эффективна на небольших проектах.

  • Сергей

    Спасибо. Для начала сойдёт.

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

отменить ответ