Защита от спам-рассылок на вашем сайте — очень важная составляющая, без которой не обходится ни один проект. Одним из эффективных способов защиты являются различные капчи, например, reCAPTCHA от Google. Но как обойтись без использования надоедливых проверочных слов или картинок?

Блокировка при AJAX-запросах

Если на вашем сайте форма обрабатывается при помощи AJAX запроса, то первое, что вы можете сделать — это запретить обращаться к PHP скрипту напрямую, без AJAX. Сделать это очень просто, добавив условие в ваш обработчик формы обратной связи:

if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
    // Обработка формы
} else {
    // Ошибка! Допустим только AJAX запрос!
}

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

Защита от спама с помощью ложного поля

В вашу форму можно добавить поле с именем name или email, а настоящие поля назвать иначе и скрыть его при помощи стилей:

<input type="text" name="name" value="" style="position: absolute; left: -9999px; display: none;">

Вот и все! Мы создали скрытое поле, которое будет видно для ботов и не видно для посетителей вашего сайта. Чем это поможет? Бот не различает видимость полей формы и заполняет поля по их именам, в нашем случае это имя или адрес электронной почты. Далее в PHP обработчике вашей формы добавляем условие на пустое поле:

if(isset($_POST["NAME"]) && $_POST["NAME"] == "") {
	// Обработка формы
} else {
	// Ошибка! Подозрение на спам!
}

Дополнительное секретное поле для защиты от спама

И еще один дополнительный метод защиты, который позволит вас ограничить отправку spam сообщений через ваши формы обратной связи. Для этого добавим 2 функции в вашу CMS систему. Если вы разрабатываете сайт на Wordpress, то добавляем функции в файл functions.php вашей темы, если работаете в 1С-Битрикс, то в файл /bitrix/php_interface/init.php:

function keengoGenerateCheckWord() {
    $alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $pass = array();
    $alphaLength = strlen($alphabet) - 1;
    for ($i = 0; $i  2 || $code  md5($pass) ) {
        return false;
    } else {
        return true;
    }
}

Далее добавляем скрытое поле в вашу форму обратной связи:

<input type="hidden" name="check" value="<?=keengoGenerateCheckWord()?>">

Таким образом мы добавляем в проверочное поле код, который состоит из случайного набора букв, точки и того же набора букв, обработанного алгоритмом md5, который шифрует в одностороннем порядке строку. Далее в php обработчике формы декодируем полученные данные при помощи функции keengoDecodeCheckWord() и проверяем верно ли передана строка:

if( keengoDecodeCheckWord($_POST["code"]) ) {
    // Обработка формы
} else {
    // Ошибка! Подозрение на спам!
}

Вот и все. Боритесь со спамом эффективно и с умом!