За годы своей практики поступало много просьб остановить поток спама с форм обратной связи. Какое-то время классические способы борьбы помогали, до тех пор, пока боты не обучатся обходить такие запреты. К этим способам относятся:
- валидация заполненных полей на js и php
- проверка полей на пустоту
- скрытое поле
- чекбокс "я не робот"
- символьная каптча
В настоящее время принцип построения форм у меня следующий: js валидация, ajax отправка данных, php обработчик данных из формы.
JavaScript валидация
Для этих целей подойдет отличный плагин jQuery Validation Plugin. Правила валидации можно прописать, используя атрибуты инпутов, либо прописать все в js. Исчерпывающею информацию можно найти в документации.
<form id="id-form" action="/contact.php?op=contact" method="post">
<input required type="text" name="fio" placeholder="ваше имя">
<input type="text" name="phone" placeholder="телефон">
<input type="submit" value="отправить">
<div class="g-recaptcha" data-sitekey="6Le98hEUAAAAAJFs_BAprcZKMaTRXm_C9RjRGJMM"></div>
<div class="answer"></div>
</form>
Ajax отправка формы
Здесь также можно использовать готовый плагин jQuery Form Plugin.
Ниже приведен код совмещения валидации с последующей отправкой формы. Адрес отправки формы указывается в атрибуте action формы.
<script>$('#id-form').validate({submitHandler:function(form){$(form).ajaxSubmit({target:$('.answer')
resetForm:true,});}})</script>
Установка captcha
Поставить каптчу на сайт проще простого. Заходим на сайт гугла, добавляем сайт, получаем ключи для сайта. Один ключ для html кода, см. выше. Другой для проверки на сервере.
Php обработка формы
Что же у нас происходит в php:
- Проверяем присланные данные с формы
- Формируем тело письма
- Отправляем на сервер гугла каптчу
- Отправляем письмо
- Информируем посетителя о результатах
<?php
if($_SERVER["REQUEST_METHOD"] == "POST"){
$to='mail@yandex.ru'; // получатель письма
$fio = htmlspecialchars($_POST['fio']);
$phone = htmlspecialchars($_POST['phone']);
$subject = "Письмо с сайта";
$message = '<html><head><title>'.$subject.'</title></head><body>
Имя: '.$fio.'<br>
Телефон: '.$phone.'<br>
</body></html>';
$headers="MIME-Version: 1.0\r\n"
."Content-type: text/html; charset=UTF-8\r\n"
."From: ".$fio." <".$to.">\r\n"
."Reply-To: ".$to."\r\n"
."X-Mailer: PHP/" . phpversion();
$recaptcha=$_POST['g-recaptcha-response'];
if(!empty($recaptcha)){
$google_url="https://www.google.com/recaptcha/api/siteverify";
$secret='6Le98hEUAAAAAAm5DW6o50LryqZxFPIouFPjluGu';
$ip=$_SERVER['REMOTE_ADDR'];
$url=$google_url."?secret=".$secret."&response=".$recaptcha."&remoteip=".$ip;
$res=getCurlData($url);
$res= json_decode($res, true);
if($res['success']){
$mail = mail($to, $subject, $message,$headers);
if($mail)
echo 'Ваше сообщение отправлено.';
else
echo '<div class="notification_error">Что-то пошло не так, попробуйте позже.</div>';
}
else{
echo 'Пройдите спам проверку!';
}
}
else{
echo 'Пройдите спам проверку!';
}
}
else echo "error";
function getCurlData($url){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16");
$curlData = curl_exec($curl);
curl_close($curl);
return $curlData;
}
?>
Готовую форму можно скачать