Спам бесит. А ещё из-за него может перегружаться сервер, что способно привести к полному краху вашего сайта. По сему сегодня я расскажу, как сделать для своей формы на сайте защиту от спама без использования капчи.
Суть проста. В отправляемую форму нужно добавить невидимое для пользователя поле (display: none), которое обязательно к заполнению, и которое мы будем заполнять через JQuery при соблюдении условия, если ширина окна браузера пользователя больше, скажем, 10px. Естественно, не надо ставить большой размер, поскольку тогда с некоторых мобильных устройств форма также не отправится. Главная задача — определить, что у устройства пользователя есть эта самая ширина окна браузера. Таким образом, мы исключаем отправку формы ботом, ибо у бота не определится размер окна, и проверочное поле останется пустым => форма не отправится.
Поехали!
Итак, приступим. Допустим, у нас есть простая форма:
<form enctype="multipart/form-data" method="post" action="mail.php">
<input type="text" name="your_name">
<input type="text" name="email">
<textarea type="text" name="message">
<input type="submit" value="Отправить">
</form>
Добавим в неё наше невидимое поле:
<form enctype="multipart/form-data" method="post" action="mail.php">
<input type="text" name="check" required style="display: none">
<input type="text" name="your_name">
<input type="text" name="email">
<textarea type="text" name="message">
<input type="submit" value="Отправить">
</form>
Далее напишем скрипт для определения, есть ли разрешение у экрана устройства. Обратите внимание — при обращении к элементу формы через атрибут name необходимо использовать знак доллара ($) перед знаком равно (=). Подробнее об этом можно прочитать в статье «Обращение к элементу формы через атрибут name в JQuery» ):
<script type="text/javascript">
$(document).ready(function($) {
doc_w = $(document).width(); // определяем ширину окна браузера
if (doc_w>10) { // если ширина окна больше 10px, заполняем поле check
$('input[name$="check"]').val('Поехали!');
};
});
</script>
Если ширина окна браузера больше 10px, то полю с name=’check’ мы задаём значение value=’Поехали!’ (неважно что писать, лишь бы не оставлять его пустым). Соответственно в противном случае ничего не делаем, и значение остаётся пустым, и форма не пройдёт проверку на валидность. Главное не забыть прописать обработку этого поля в собственно обработчике формы. В моём случае он вынесен в файл mail.php:
<?php
if(!empty($_POST['mail'])){
$name = trim(strip_tags($_POST['your_name']));
$email = trim(strip_tags($_POST['email']));
$message = trim(strip_tags($_POST['message']));
$check = trim(strip_tags($_POST['check']));
if ($check == 'Поехали!') { // если поле check имеет value="Поехали!" (т.е. не пустое), то отправляем
mail('your_mail@mail.ru', 'Письмо с формы с защитой от спама', 'Имя: '.$name.'<br />Почта: '.$email.'<br /> Cообщение: '.$message, "Content-type:text/html;charset=utf-8");
echo 'Ваше сообщение отправлено!';
exit;
}
}
else { // если в поле check value не равно "Поехали!"
echo 'Для отправки сообщения заполните все поля!';
exit;
}
?>
Вот собственно и всё. Таким нехитрым способом мы избавляемся от тонн спама на своей почте. Данный метод можно применять как к своим собственным формам, так и к плагинам форм (вроде Contact Form 7 и т.п.)
Всем удачи и пока!