SAPID INFO

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

Код формы для случая с мультиязычным (RU, TR, EN) сайтом:

<form class="" action="<?php echo 'http://'.$_SERVER['HTTP_HOST'].'/thanks/'; ?>" method="$_POST">
	<textarea class="" placeholder="<?php
		if ( $lang == 'ru' ) { echo 'Ваше сообщение'; }
		if ( $lang == 'tr' ) { echo 'Mesajınız'; }
		if ( $lang == 'en' ) { echo 'Your message'; }
	?>" name="mesago"></textarea>
	<input class="" type="text" placeholder="<?php
		if ( $lang == 'ru' ) { echo 'Ваше имя'; }
		if ( $lang == 'tr' ) { echo 'Adın'; }
		if ( $lang == 'en' ) { echo 'Your name'; }
	?>" name="nomo" required="required">
	<input class="" type="text" placeholder="<?php
		if ( $lang == 'ru' ) { echo 'Ваш телефон'; }
		if ( $lang == 'tr' ) { echo 'Telefonunuz'; }
		if ( $lang == 'en' ) { echo 'Your phone number'; }
	?>" name="telefono" required="required">
	<input class="" type="text" placeholder="<?php
		if ( $lang == 'ru' ) { echo 'Ваш e-mail'; }
		if ( $lang == 'tr' ) { echo 'E-posta'; }
		if ( $lang == 'en' ) { echo 'Your e-mail'; }
	?>" name="posto" required="required">
	<div style="display: none;">
		<?php /* для спам-ботов */?>
		<input type="text" name="name">
		<input type="email" name="mail">
		<input type="email" name="email">
		<input type="text" name="phone">
		<input type="text" name="tel">
		<input type="text" name="url">
		<?php /* данные о форме */?>
		<input type="text" name="formo" id="formo" value="Форма в фетере"><?php /* где именно на странице */?>
		<input type="text" name="ago" id="ago" value="Хотят получить буклет `Примеры работ`"><?php /* что надо в ответ */?>
		<input type="text" name="pago" value="<?php echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; ?>"><?php /* ссылка на страницу */?>
		<input type="text" name="lingvo" value="<?php echo $lang; ?>"><?php /* активный язык на странице */?>
	</div>
	<button type="submit" class="">
		<?php
			if ( $lang == 'ru' ) { echo 'Оставить заявку'; }
			if ( $lang == 'tr' ) { echo 'Başvuru formunu bırak'; }
			if ( $lang == 'en' ) { echo 'Submit request'; }
		?>
	</button>
</form>

Если на сайте только 1 язык – вот форма:

<form class="" action="<?php echo 'http://'.$_SERVER['HTTP_HOST'].'/thanks/'; ?>" method="$_POST">
	<textarea class="" placeholder="Ваше сообщение" name="mesago"></textarea>
	<input class="" type="text" placeholder="Ваше имя" name="nomo" required="required">
	<input class="" type="text" placeholder="Ваш телефон" name="telefono" required="required">
	<input class="" type="text" placeholder="Ваш e-mail" name="posto" required="required">
	<div style="display: none;">
		<?php /* для спам-ботов */?>
		<input type="text" name="name">
		<input type="email" name="mail">
		<input type="email" name="email">
		<input type="text" name="phone">
		<input type="text" name="tel">
		<input type="text" name="url">
		<?php /* данные о форме */?>
		<input type="text" name="formo" id="formo" value="Форма в фетере"><?php /* где именно на странице */?>
		<input type="text" name="ago" id="ago" value="Хотят получить буклет `Примеры работ`"><?php /* что надо в ответ */?>
		<input type="text" name="pago" value="<?php echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; ?>"><?php /* ссылка на страницу */?>
	</div>
	<button type="submit" class="">Оставить заявку</button>
</form>

В обеих случаях у формы есть поля с id formo и ago. Сделано это для того, чтобы создать 1 попап для всей страницы и подставлять в поля формы информацию о том, с какой именно кнопки было вызвано всплывающее окно с формой. Привожу пример кнопки (перенос строки поставил для удобства просмотра):

<button class="" onclick="
	document.getElementById('formo').value = 'Всплывающее окно, кнопка на 1м экране';
	document.getElementById('ago').value = 'Бесплатная консультация';
	">
	Бесплатная консультация
</button>

В корне сайта нужно создать директорию thanks, в ней – файл index.php. Путь будет примерно такой:

  • site.ru/www/thanks/index.php
  • site.ru/thanks/index.php
  • public_html/thanks/index.php

В этот файл вставляем код обработчика.

Пример для мультиязычного (RU, TR, EN) сайта:

<?php
/* эти поля должны быть пустыми (антиспам-фильтр) */
if (($_GET['name'] != '') or ($_GET['mail'] != '') or ($_GET['tel'] != '') or ($_GET['url'] != '') or ($_GET['email'] != '') or ($_GET['phone'] != '')) { echo 'Сработал антиспам-фильтр, данные в обработчик не переданы.'; die; }
if (($_GET['posto'] == '') and ($_GET['telefono'] == '') ) { echo 'Пустые все контактные данные. Обработчик в подобных ситуациях не запускается.'; die; }
 
/* на какую почту отправляем письмо */
$support_mail = '[email protected]';
 
/* вынимаем данные человека */
/* имя */
if (isset($_GET['nomo'])) { $user_name = $_GET['nomo']; }
/* почта */
if (isset($_GET['posto'])) { $user_mail = $_GET['posto']; }
/* телефон или скайп */
if (isset($_GET['telefono'])) { $user_phone = $_GET['telefono']; }
/* сообщение человека */
if (isset($_GET['mesago'])) { $user_mes = $_GET['mesago']; }

/* вынимаем данные о форме */
/* где на странице */
if (isset($_GET['formo'])) { $form_location = $_GET['formo']; }
/* ссылка на страницу */
if (isset($_GET['pago'])) { $form_page_link = $_GET['pago']; }
/* что требуется в ответе */ 
if (isset($_GET['ago'])) { $form_data = $_GET['ago']; }
/* язык страницы */ 
if (isset($_GET['lingvo'])) { $lang = $_GET['lingvo']; }


/* формируем тему письма */
$mail_subject = 'Сообщение с сайта '.$_SERVER['HTTP_HOST'];
if ($user_name != '') { $mail_subject .= ' от '.$user_name; };
if ($user_mail != '') { $mail_subject .= ', e-mail: '.$user_mail; };
if ($user_phone != '') { $mail_subject .= ', тел: '.$user_mail; };
 
/* формируем содержимое тела письма */
$mail_message = '<html>
<head>
  <title>'.$mail_subject.'</title>
</head>
<body>
<div>Заявка с сайта '.$_SERVER['HTTP_HOST'].'</div>';
if ($user_name != '')   { $mail_message .= '<div>Имя: '.$user_name.'</div>'; }
if ($user_mail != '')   { $mail_message .= '<div>E-mail: '.$user_mail.'</div>'; }
if ($user_phone != '')  { $mail_message .= '<div>Телефон: '.$user_phone.'</div>'; }
if ($user_mes != '')  { $mail_message .= '<div>Сообщение человека: '.$user_mes.'</div>'; }
if ($lang != '')    { $mail_message .= '<div>Язык страницы: '.$lang.'</div>'; }
if ($form_data != '')    { $mail_message .= '<div>Данные о форме (УТП): '.$form_data.'</div>'; }
if ($form_location != '')    { $mail_message .= '<div>Где расположена форма: '.$form_location.'</div>'; }
if ($form_page_link != '')   { $mail_message .= '<div>Ссылка на страницу: <a href="'.$form_page_link.'">'.$form_page_link.'</a></div>'; }
$mail_message .= '</body></html>';
 
/* формируем заголовок письма */
$mail_headers  = "MIME-Version: 1.0\r\n";
$mail_headers .= "Content-type: text/html; charset=utf-8\r\n"; 
$mail_headers .= "From: Form notice <[email protected]".$_SERVER['HTTP_HOST'].">"."\r\n";
 
/* отправляем сообщение */
if (mail($support_mail, $mail_subject, $mail_message, $mail_headers)) {
    $send_status = 'true';
}?>
<!DOCTYPE html>
<html>
    <head>
        <title>
            <?php
                if ( $lang == 'ru' ) { echo 'Благодарим за Вашу заявку!'; }
                if ( $lang == 'tr' ) { echo 'Başvurunuz için teşekkür ederiz!'; }
                if ( $lang == 'en' ) { echo 'Thank you for your application!'; }
            ?>
        </title>
        <link href="<?php echo 'http://'.$_SERVER['HTTP_HOST'].'/favicon.ico'; ?>" rel="shortcut icon">
        <meta name="description" content="">
        <meta name="keywords" content="">
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <meta name="apple-mobile-web-app-capable" content="yes">
        <meta name="format-detection" content="telephone=no">
        <meta name="viewport" content="width=device-width, maximum-scale=1, initial-scale=1">
        <link href="https://fonts.googleapis.com/css?family=Raleway:100,300,400,700&amp;subset=latin-ext" rel="stylesheet"> 
    </head>
<body class="page-thanks-body">
    <div class="thanks-message-container">
        <?php
            if ( $send_status == 'true' ) {
                /* Спасибо */
                if ( $lang == 'ru' ) { echo '<h1>Благодарим за Вашу заявку!</h1>'; }
                if ( $lang == 'tr' ) { echo '<h1>Başvurunuz için teşekkür ederiz!</h1>'; }
                if ( $lang == 'en' ) { echo '<h1>Thank you for your application!</h1>'; }
                /* Заявка получена, мы свяжемся с вами в ближайшее время. */
                if ( $lang == 'ru' ) { echo '<h2>Сообщение успешно получено. Наши специалисты свяжутся с Вами в ближайшее время.</h2>'; }
                if ( $lang == 'tr' ) { echo '<h2>Mesaj başarıyla alındı. Uzmanlarımız yakın gelecekte sizinle iletişime geçecektir.</h2>'; }
                if ( $lang == 'en' ) { echo '<h2>The message was successfully received. Our experts will contact you shortly.</h2>'; }
                /* Через 10 секунд Вы будете переадресованы на страницу, с которой отправили сообщение. */
                if ( $lang == 'ru' ) { echo '<h3>Через 15 секунд Вы будете переадресованы на страницу, с которой отправили сообщение.</h3>'; }
                if ( $lang == 'tr' ) { echo '<h3>15 saniye sonra, mesajın gönderildiği sayfaya yönlendirileceksiniz.</h3>'; }
                if ( $lang == 'en' ) { echo '<h3>After 15 seconds you will be redirected to the page from which the message was sent.</h3>'; }
                /* Кнопка: Перейти прямо сейчас. */
                if ( $lang == 'ru' ) { echo '<a href="'.$form_page_link.'">Перейти прямо сейчас</a>'; }
                if ( $lang == 'tr' ) { echo '<a href="'.$form_page_link.'">Hemen git</a>'; }
                if ( $lang == 'en' ) { echo '<a href="'.$form_page_link.'">Go now!</a>'; }
            } else {
                /* Внимание, сообщение не получено! */
                if ( $lang == 'ru' ) { echo '<h1>Внимание, сообщение не отправлено!</h1>'; }
                if ( $lang == 'tr' ) { echo '<h1>Dikkat, mesaj gönderilmedi!</h1>'; }
                if ( $lang == 'en' ) { echo '<h1>Attention, the message was not sent!</h1>'; }
                /* Заявка получена, мы свяжемся с вами в ближайшее время. */
                if ( $lang == 'ru' ) { echo '<h2>Попробуйте отправить позже или свяжитесь с нами другим способом.</h2>'; }
                if ( $lang == 'tr' ) { echo '<h2>Daha sonra göndermeyi deneyin veya başka bir yolla bizimle iletişime geçin.</h2>'; }
                if ( $lang == 'en' ) { echo '<h2>Try to send later or contact us in another way.</h2>'; }
                /* Через 10 секунд Вы будете переадресованы на страницу, с которой отправили сообщение. */
                if ( $lang == 'ru' ) { echo '<h3>Через 15 секунд Вы будете переадресованы на страницу, с которой отправили сообщение.</h3>'; }
                if ( $lang == 'tr' ) { echo '<h3>15 saniye sonra, mesajın gönderildiği sayfaya yönlendirileceksiniz.</h3>'; }
                if ( $lang == 'en' ) { echo '<h3>After 15 seconds you will be redirected to the page from which the message was sent.</h3>'; }
                /* Кнопка: Перейти прямо сейчас. */
                if ( $lang == 'ru' ) { echo '<a href="'.$form_page_link.'" class="blue-gradient">Перейти прямо сейчас</a>'; }
                if ( $lang == 'tr' ) { echo '<a href="'.$form_page_link.'" class="blue-gradient">Hemen git</a>'; }
                if ( $lang == 'en' ) { echo '<a href="'.$form_page_link.'" class="blue-gradient">Go now!</a>'; }
            }
        ?>
    </div>
<style>
* { letter-spacing: 1px; }
.page-thanks-body { margin: 0; padding: 0; font-family: 'Raleway', sans-serif; color: #fff; }
.thanks-message-container { width: 100vw; min-height: 100vh; background: url(<?php echo 'http://'.$_SERVER['HTTP_HOST'].'/thanks/images/thanks-bg.jpg'; ?>) center center no-repeat; background-size: cover; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; }
a { background: rgba(0,108,246,1); background: -moz-linear-gradient(left, rgba(0,108,246,1) 0%, rgba(0,183,255,1) 100%); background: -webkit-gradient(left top, right top, color-stop(0%, rgba(0,108,246,1)), color-stop(100%, rgba(0,183,255,1))); background: -webkit-linear-gradient(left, rgba(0,108,246,1) 0%, rgba(0,183,255,1) 100%); background: -o-linear-gradient(left, rgba(0,108,246,1) 0%, rgba(0,183,255,1) 100%); background: -ms-linear-gradient(left, rgba(0,108,246,1) 0%, rgba(0,183,255,1) 100%); background: linear-gradient(to right, rgba(0,108,246,1) 0%, rgba(0,183,255,1) 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#006cf6', endColorstr='#00b7ff', GradientType=1 ); background-clip: text; text-fill-color: transparent; -webkit-background-clip: text; -webkit-text-fill-color: transparent; color: #fff; display: block; font-size: 36px; text-decoration: none; }
</style>
<script language = 'javascript'>
    var delay = 15000;
    setTimeout("document.location.href='<?php echo $form_page_link; ?>'", delay);
</script>
</body>
</html>

Как можно видеть из кода выше:

  • Обработчик проверяет скрытые поля, которые потенциально могут быть заполнены спам-ботом, и если хоть одно из них заполнено – прекращает работу.
  • Обработчик возвращает информацию о том, удалось успешно отправить сообщение или нет, что соответственно меняет сообщение на странице.
  • После вывода сообщения о статусе отправки через 15 секунд происходит переадресация на страницу, с которой была отправлена заявка.

Комментарии к статье
Антон, Сентябрь 2, 2017 в 10:03 дп:

Доработки дальше планируются?

Автор блога sapid.info, Сентябрь 2, 2017 в 11:53 дп:

Да, нужно еще js проверяющий все ли обязательные поля заполнены. iOS устройства игнорируют параметр required.

Alex, Сентябрь 20, 2017 в 1:05 пп:

<form class="" action="” method=”$_POST”>
Нужно поправить method=”POST”

Alex, Сентябрь 20, 2017 в 2:38 пп:

$mail_headers .= “From: Form notice “.”\r\n”;
Нужно поправить на
$mail_headers .= “From: “.$_SERVER[‘SERVER_NAME’].” “.”\r\n”;

Добавьте свой комментарий - оставьте след в блоге!