Расширеная форма обратной связи на PHP

При использовании простых форм обратной связи мы не можем защитить себя от спама и ввода специальных символов. Когда у меня на сайте появилась такая проблема, как спамеры, я подумал и создал данный скрипт. Он позволяет избавиться от 80-90% процентов спамерских ботов. Вы спросите, почему не 100%? Я овечу. На сто процентов никто не может гарантировать защиту от спамеров.

Давайте начнем урок. Сейчас мы рассмотрим часть кода. Это простой код, какой просто отправляет нам письмо на e-mail. Мы возьмем его за основу.


 $name = $_POST['name']; 
 $email = $_POST['email']; 
 $url = $_POST['url']; 
 $comments = $_POST['comments']; 
 $recipient = "youremail@url.com"; 
 $subject = "Вам прислали письмо"; 
 $message = "Имя: $name n"; 
 $message .= "E-mail: $email n"; 
 $message .= "URL сайта: $url n"; 
 $message .= "Коментарий: $comments nn"; 
 $headers = "From: My Form n"; 
 $headers .= "Reply-To: $email"; 
 mail($recipient,$subject,$message,$headers); 
 

Первое, что мы должны сделать, это проверку на нажатие кнопки в форме. Это действие позволит избавиться от некоторых спамерских ботов. Разместим код проверки в верхнюю часть страницы.


 if (!isset($_POST['submit'])) { 
 echo "<h1>ОШИБКА</h1>n 
 <p>Эта страница не доступна по прямому запросу!</p>"; 
 exit(); 
 }
 

Примечание: функция exit(); останавливает процесс обработки страницы.

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


 function cleanUp($data) { 
 $data = trim(strip_tags(htmlspecialchars($data))); 
 return $data; 
 }
 

Написанную нами функцию разместим примерно так.


 function cleanUp($data) { 
 $data = trim(strip_tags(htmlspecialchars($data))); 
 return $data; 
 }
 $name = cleanUp($_POST['name']); 
 $email = cleanUp($_POST['email']); 
 $url = cleanUp($_POST['url']); 
 $comments = cleanUp($_POST['comments']);
 

Теперь нам необходимо сделать проверку на пустые поля. Для этого мы будем использовать встроенную PHP функцию.


 if ((empty($name)) or (empty($email)) or (empty($comments))) { 
 echo "<h2>Ошибка ввода данных</h2>n 
 <p><strong>Имя</strong>, <strong>e-mail</strong> и <strong>Коментарии</strong> обязательны для заполнения. Пожалуйста, заполните их и попробуйте еще раз:</p>"; 
 echo "<form action="process.php" method="post"><p>"; 
 echo "<input type="text" name="name" id="name" value="$name" /> Имя<br />"; 
 echo "<input type="text" name="email" id="email" value="$email" /> E-mail<br />"; 
 echo "<input type="text" name="url" id="url" value="$url" /> URL сайта<br />"; 
 echo "<textarea name="comments" id="comments">$comments</textarea> Комментарии<br />"; 
 echo "<input type="submit" name="submit" id="submit" value="Send" />"; 
 echo "</p></form>"; 
 exit (); 
 }
 

Выше приведенный код, которые проверяет поля на заполнения. Если поле не заполнено, скрипт выводит ошибку и заново форму. Это действие позволяет пользователям заполнить полу, какое не было заполнено, без потери данных.

Далее будем проверять правильность ввода E-mail адреса.


 if (!ereg("^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)*$",$email)) { 
 echo "<h2>Ошибка ввода</h2>n 
 <p>Адресс электронной почты введен не верно :</p>"; 
 echo "<form action="process.php" method="post"><p>"; 
 echo "<input type="text" name="name" id="name" value="$name" /> Имя<br />"; 
 echo "<input type="text" name="email" id="email" value="$email" /> E-mail<br />"; 
 echo "<input type="text" name="url" id="url" value="$url" /> URL сайта<br />"; 
 echo "<textarea name="comments" id="comments">$comments</textarea> Комментарий<br />"; 
 echo "<input type="submit" name="submit" id="submit" value="Send" />"; 
 echo "</p></form>"; 
 exit(); 
 }
 

Затем будем блокировать ввод мэта тегов.


 $email = preg_replace("([rn])", "", $email);
 $find = "/(content-type|bcc:|cc:)/i"; 
 if (preg_match($find, $name) or preg_match($find, $email) or preg_match($find, $url) || preg_match($find, $comments)) { 
 <p>Вводите без мэта тегов.</p>"; 
 exit(); 
 }
 

После того, как Вы объедините все шаги, сохраните PHP файл под именем process.php. Код примерно должен быть таким::


 <?php 
 if (!isset($_POST['submit'])) { 
 echo "<h1>Ошибка</h1>n 
 <p> Эта страница не доступна по прямому запросу!</p>"; 
 exit(); 
 }
 function cleanUp($data) { 
 $data = trim(strip_tags(htmlspecialchars($data))); 
 return $data; 
 }
 $name = cleanUp($_POST['name']); 
 $email = cleanUp($_POST['email']); 
 $url = cleanUp($_POST['url']); 
 $comments = cleanUp($_POST['comments']);
 if ((empty($name)) or (empty($email)) or (empty($comments))) { 
 echo "<h2>Ошибка ввода</h2>n 
 <p><strong>Имя</strong>, <strong>e-mail</strong> или <strong>комментарии</strong> не были заполнены, попробуйте еще раз:</p>";
 echo "<form action="process.php" method="post"><p>"; 
 echo "<input type="text" name="name" id="name" value="$name" /> Имя<br />"; 
 echo "<input type="text" name="email" id="email" value="$email" /> E-mail<br />"; 
 echo "<input type="text" name="url" id="url" value="$url" /> URL сайта<br />"; 
 echo "<textarea name="comments" id="comments">$comments</textarea> Комментарий<br />"; 
 echo "<input type="submit" name="submit" id="submit" value="Send" />"; 
 echo "</p></form>";
 exit(); 
 }
 if (!ereg("^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)*$",$email)) { 
 echo "<h2>Ошибка ввода</h2>n 
 <p>Вы ввели неверный формат e-mail адреса:</p>";
 echo "<form action="process.php" method="post"><p>"; 
 echo "<input type="text" name="name" id="name" value="$name" /> Имя<br />"; 
 echo "<input type="text" name="email" id="email" value="$email" /> E-mail<br />"; 
 echo "<input type="text" name="url" id="url" value="$url" /> URL сайта<br />"; 
 echo "<textarea name="comments" id="comments">$comments</textarea> Комментарий<br />"; 
 echo "<input type="submit" name="submit" id="submit" value="Send" />"; 
 echo "</p></form>";
 exit(); 
 }
 $email = preg_replace("([rn])", "", $email);
 $find = "/(content-type|bcc:|cc:)/i"; 
 if (preg_match($find, $name) || preg_match($find, $email) || preg_match($find, $url) || preg_match($find, $comments)) { 
 echo "<h1>Error</h1>n 
 <p>Вводите без мета тегов.</p>"; 
 exit; 
 }
 $recipient = "youremail@url.com"; 
 $subject = "Сообщение из сайта";
 $message = "Имя: $name n"; 
 $message .= "E-mail: $email n"; 
 $message .= "URL сайта: $url n"; 
 $message .= "Коммментарий: $comments";
 $headers = "From: My Form rn"; 
 $headers .= "Reply-To: $email";
 if (mail($recipient,$subject,$message,$headers)) { 
 echo "<p>Сообщение отправленно.</p>"; 
 } else { 
 echo "<p>Сообщение не было отправлено, попробуйте позже.</p>"; 
 } 
 ?>
 

На этом все. Желаю всем меньше проблем со спамом.

Понравился урок? Добавьте его к себе в закладки.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *