Как создать капчу, для защиты формы обратной связи?!
Эта статья устарела. Обновленную версию смотрите тут
В этой статье я расскажу, как защитить форму обратной связи от специализированных скриптов, которые в автоматическом режиме отправляют сообщения с формы обратной связи!
Самый распространенный способ – это проверить действительно ли за монитором находится человек, а не программа-робот. Если за монитором находится человек, то от него потребуется ввести символы, изображенные на картинке. Такой метод получил название – CAPTCHA
Именно созданием капчи, мы и будем заниматься, и выглядеть наша форма будет следующим образом:
Как видите, прежде чем нажать на кнопку "Отправить сообщение", пользователю необходимо ввести цифры изображенные на картинке.
Для реализации этого метода, Вам понадобится подготовить 10 изображений с цифрами от 0 до 9, которые бы имели названия аналогичные своим изображенным цифрам. Чтобы не заморачиваться можете воспользоваться моими. Скачать архив с изображениями можно здесь.
Теперь давайте посмотрим сам код страницы с формой. Выглядит он так:
<form action="send_test.php" method="post"> <p>Введите имя:<br> <input type="text" name="name"></p> <p>Введите email:<br> <input type="text" name="email"></p> <p>Введите сообщение:<br> <textarea name="message" cols="40" rows="5" ></textarea> </p> <p>Введите числа с картинки: <br> <?php $i=1; do { $num[$i] = mt_rand(0,9); echo "<img src='img/".$num[$i].".gif' border='0' align='bottom' vspace='5px'>"; $i++; } while ($i<5); $captcha = $num[1].$num[2].$num[3].$num[4]; ?> <input name="captcha" type="hidden" value="<?php echo $captcha ;?>"> <input name="pr" style=" margin-bottom:11px" type="text" size="6" maxlength="4"></p> <p><input type="submit" class="bt1" value="Отправить сообщение"></p> </form>
Для генерации случайных чисел, я использовал функцию mt_rand(), которая генерирует наилучшее случайное значение в диапазоне от 0 до 9.
Сгенерированное число (от 0 до 9) записывается в массив $num(), которое затем подставляется для вывода аналогичного изображения. Все это проделывается в цикле 4 раза, тем самым мы получаем 4 цифры.
Полученные цифры мы записываем в переменную $captcha, которая затем передается обработчику send.php, где она будет сравниваться с переменной $pr.
В переменную $pr заносится информация, которую ввел пользователь.
Следует заметить, что поле captcha – скрытое и оно не отображается в браузере:
<input name="captcha" type="hidden" value="<?php echo $captcha ;?>">
Как видите здесь нет ничего сложного.
Теперь перейдем к самому обработчику send.php, который мы уже создали в прошлой статье.
Как Вы помните, там осуществляется проверка на заполнение всех полей и правильность ввода email-адреса. Нам остается лишь добавить проверку на правильность ввода капчи!
Итак, обработчик send.php будет иметь следующий вид:
<?php /* Проверяем существуют ли переменные, которые передала форма обратной связи. Если не существуют, то мы их создаем. Если форма передала пустые значения мы их удаляем */ if (isset($_POST['name'])) {$name = $_POST['name']; if ($name == '') {unset($name);}} if (isset($_POST['email'])) {$email = $_POST['email']; if ($email == '') {unset($email);}} if (isset($_POST['message'])) {$message = $_POST['message']; if ($message == '') {unset($message);}} if (isset($_POST['pr'])){$pr = $_POST['pr']; if ($pr == '') {unset($pr);}} if (isset($_POST['captcha'])){$captcha = $_POST['captcha'];} /* Проверяем заполнены ли все поля */ if (isset($name) && isset($email) && isset($message) && isset($pr)) { /* Убираем все лишние пробелы, а также преобразуем все теги HTML в символы*/ $name = htmlspecialchars(trim($name)); $email = htmlspecialchars(trim($email)); $message = htmlspecialchars(trim($message)); /* Проверяем правильность ввода email-адреса */ if(!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email)) { exit("<p>Неправильный формат e-mail адреса!</p>"); } /* Проверяем правильность ввода капчи */ if ($captcha == $pr) { /* Формируем сообщение */ $address = "email@sait.ru"; //Здесь нужно вписать Ваш email $sub = "Сообщение с моего нового сайта!!!"; $mes = "Автор назвался: $name \nОставил такой E-mail: $email \nСодержание письма: \n$message"; /* Отправка сообщения */ $verify = mail ($address,$sub,$mes,"Content-type:text/plain; charset = windows-1251\r\nFrom:$email"); if ($verify == 'true') { echo "Сообщение отправлено!"; } else { echo "Сообщение не отправлено!"; } } else { echo "Вы не правильно ввели сумму чисел с картинки"; } } else { echo "Вы заполнили не все поля!"; } ?>
Ну вот собственно и все! Удачи!
Скачать исходники можно по этой ссылке
-
Комментарии (82)
- Сайт
Facebook