Не думал писать на эту тему… Эта статья создана по просьбе одного из читателей BlogGood.ru, который оставил комментарий с просьбой написать статью о том, как на форму обратной связи установить капчу.
В статье найдете полностью готовый код , который вы сможете скачать.
Капча – это хороший способ защитить форму обратной связи, регистрации, входа в админку или в кабинет.
Эту капчу, которую я предлагаю, можно привязать к любой форме.
Вот так будет выглядеть капча и форма обратной связи:
Форма обратной связи не отправится, пока не будет правильно введена капча (цифры на картинке).
Для реализации капчи вам нужно будет подготовить 10 изображений с цифрами 0-9 (либо скачайте их тут).
Код капчи (captcha)
Создайте файл с названием «captcha.php» и вставьте в него вот такой код:
<p>Введите числа с картинки: <br> <?php $i=1; do { $num[$i] = mt_rand(0,9); echo "<img src='/images/".$num[$i].".gif' border='0' align='bottom' vspace='5px'>"; $i++; } while ($i<6); $captcha = $num[1].$num[2].$num[3].$num[4].$num[5]; ?> <input name="captcha" ENGINE="hidden" value="<?php echo $captcha ;?>">
Для генерации случайных чисел здесь используется php функция «mt_rand()».
Генерирует в диапазоне от 0 до 9.
После того, как сгенерировалось число, оно записывается в массив «$num()». Потом выводится соответствующее изображение и так 5 раз, благодаря циклу «while». Вот так и получаем на экран 5 цифр.
Все эти 5 цифр записываются в переменную «$captcha».
Переменная «$captcha» будет передаваться обработчику формы для проверки на соответствие цифр, что были введены в поле.
Обработчик формы и капчи (проверка и отправка данных)
Создайте файл «form-handler.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['captcha_validation'])){$captcha_validation = $_POST['captcha_validation']; if ($captcha_validation == '') {unset($captcha_validation);}} if (isset($_POST['captcha'])){$captcha = $_POST['captcha'];} /* Проверяем, заполнены ли все поля */ if (isset($name) && isset($email) && isset($message) && isset($captcha_validation)) { /* Проверяем правильность ввода капчи */ if ($captcha == $captcha_validation) { /* если капча верна, отправляем сообщение */ /* Настройки сообщения */ $address = "test@test"; $sub = "Сообщение с сайта BlogGood.ru!!!"; $mes = "Имя: $name \nE-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 "Вы заполнили не все поля!"; } ?>
В этом коде все, что касается обработки данных, проверки полей, ввода капчи и отправки самого письма.
В коде есть комментарий, где какая часть за что отвечает.
Вам только нужно поменять на свое усмотрение содержание письма и заменить обязательно мой email (test@test) на собственный (строка №21):
/* Настройки сообщения */ $address = "test@test"; $sub = "Сообщение с сайта BlogGood.ru!!!"; $mes = "Имя: $name \nE-mail: $email \nСодержание письма: \n$message";
Теперь сама форма.
Форма обратной связи с капчей
Вставьте вот этот код в то место, где нужно, чтобы выводилась форма:
<form action="form-handler.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> <!-- вывод капчи из файла captcha.php --> <?php require ("captcha.php"); ?> <input name="captcha_validation" style=" margin-bottom:11px" type="text" size="6" maxlength="5"></p> <p><input type="submit" class="bt1" value="Отправить сообщение"></p> </form>
Внимание: файлы «form-handler.php» и «captcha.php» должны находиться в одной папке с формой или же, если так не получается, не забываем менять путь к обработчику «form-handler.php»
<form action="form-handler.php" method="post">
И к капче
<?php require ("captcha.php"); ?>
Как правильно указать путь к файлу, читайте вот тут.
Кстати, если к форме добавить класс, то можно при помощи CSS добавить к капче различные эффекты, например, искажение (см. тут):
echo "<img src='/images/".$num[$i].".gif' border='0' align='bottom' vspace='5px' class='captcha'>";
Файл «captcha.php»
Проверим работу капчи?
Да, проверим, чтобы не было сомнений на счет работоспособности кода.
Вначале я введу в капчу неправильные цифры.
Если нажать «Отправить сообщение», то вы увидите вот это уведомление:
Вы неправильно ввели цифры с картинки
Капча не дала нам отправить сообщение, так как была допущена ошибка при вводе цифр.
Пробуем ввести правильно капчу:
Если нажать «Отправить сообщение», то вы увидите вот это уведомление:
Сообщение отправлено!
Проверяем почту:
Ну, что вам сказать, все работает! Ура-а-а-а!
Пользуйтесь!
Ах да, чуть бы не забыл – вы можете скачать исходник.
Понравился пост? Помоги другим узнать об этой статье, кликни на кнопку социальных сетей ↓↓↓
Последние новости категории:
Похожие статьи
Популярные статьи:
-
Как узнать id компьютера
Дата: 29 марта 2013
Прокомментировано:90
просмотров: 329815 -
Размеры форматов листов А0 – А7
Дата: 23 января 2013
Прокомментировано:3
просмотров: 274369 -
Смешные логические загадки с подвохом, отгадки прилагаются
Дата: 12 ноября 2014
Прокомментировано:5
просмотров: 220443 -
Установка windows 7 на ноутбук
Дата: 18 декабря 2012
Прокомментировано:169
просмотров: 186394 -
Готовые макеты блоков для веб-страниц на HTML и CSS
Дата: 25 июня 2014
Прокомментировано:23
просмотров: 181501
38 Ответов на комментарий - Форма обратной связи с капчей на PHP
Добавить комментарий
Метки: php, для сайта, форма обратной связи
Как всегда спасибо Степан за хороший и Нужный пост !
Пожалуйста, Александр!
наверное, хорошая форма, но фокус не удался. для новичков в php желательно разъяснять более подробно что и куда необходимо записывать. согласитесь, что php-монстры не будут искать такую информацию.
Я думаю, новичков в php нужно не с капчи начинать, а с основы PHP.
Основные разъяснение по коду в статье есть.
думаю, у меня не получается из-за неправильно прописанных путей к файлам. файлы captcha.php и form-handler.php я создал в папке с темой. там же разместил папку images с изображениями цифр для капчи. перепробовал все варианты с указанием пути к файлам – бесполезно. не могли бы вы показать как должен выглядеть код
и
в данном случае?
Попробуйте вот так:
и
Если Вы пользуетесь вордпресс, тогда есть готовый плагин:
/wordpress/zashhita-adminki-wordpress-s-pomoshhyu-kapchi.html/
Вот какую сделал я:
Прикольно!
Расскажете, Николай, как сделали или это много писать?
подскажите, пожалуйста, как еще должна выглядеть строчка
? файл captcha.php находится в папке с темойю капча никак не выводится
Попробуйте вот так:
в коде “НАЗВАНИЕ_ТЕМЫ” – нужно поменять на название вашей темы (название папки)
спасибо за помощь, но форма так и не заработала. все пути к файлам прописал, перепроверил 100 раз – не работает . у меня версия php-7.0., сайт на wp. может ли быть причина в том что версия php-7? просто у меня и раньше была реализована форма обратной связи без плагина, но когда произвел переход с 5.3 на 7.0, то форма обратной связи тоже работать перестала. однако, плагин ФОС отрабатывал нормально. просто хотел обойтись на этот раз без плагина, но видимо не судьба.
Это нужно мне садиться и смотреть в чем проблема. Там может быть не значительная ошибка и все, форма работать на сайте не будет.
Это все хорошо, но хотелось бы отметить несколько вещей.
1. Защита формы. От кого? От того, кто и так не будет пытаться ее брутфорсить?
Вот это:
в форме – это же то же самое, что мы показываем в капче.
Возникает вопрос, если скрипту, пытающемуся подобрать логин/пароль, в явном виде отдается капча, которую вставить в запрос к серверу – дело одной ф-ции, то какой смысл в этой капче?
2. Картинки для цифр.
Они должны генерироваться каждый раз разные. Иначе скачав их однажды и получив их текстовое представление (в base64) скрипт сможет, сравнивая то, что выводит форма, с уже имеющимися данными, подставлять цифры, которым эти картинки соответствуют.
Вывод: Цель, для которой используется капча – защита от автоотправки формы – не достигнута.
По сути, что нужно:
1. Не выводить в форме код в явном виде (хранить его в сессионных переменных).
2. Генерировать каждый раз разные изображения.
Если интересно, могу выложить готовый код капчи с пользовательскими настройками, не страдающей перечисленными выше недостатками.
PS.
Что еще хотелось бы отметить, так это немного неправильную организацию условий. В таком количестве вложенных if’ов с else, почти нереально понять, что к чему относится.
Вместо
в данном случае гораздо лучше смотрелось бы
Степан, здравствуйте!
Помогите, пожалуйста, разобраться.
Сделал все, как в примере, но при нажатии на кнопку “отправить сообщение” постоянно выдается “сообщение не отправлено”.
Не могу понять в чем дело.
код формы на странице feedback.php:
код на странице form-handler.php:
Здравствуйте, Александр!
Вы не полностью сделали как на примере. У меня нет поля “Тема сообщения”.
По началу я думал, что вы не прописали переменную в обработчике. Но все вижу, что сделано корректно и правильно.
Проверил Ваш код у себя, у меня отправка письма идет. Очень странно.
Тут я вижу без бубна не обойтись. Я мог бы глянуть у вас на сайте, но мне нужны будут доступы и время.
Степан, здравствуйте!
Я разобрался, функция отправки почты php mail ( ) была отключена, поэтому не работала форма обратной связи.
Спасибочки! Все отлично работает.
Привет!
Спасибо большое за капчу. Жил себе блог 7 лет, и тут на тебе – повалился спам на почту через форму… Ну и пришлось воспользоваться твоим решением – теперь снова всё ок.
Здравствуйте! Пожалуйста!
Если вдруг снова СПАМ появится, попробуйте “reCAPTCHA”
Здравствуйте, Степан! Отличный скрипт. Есть маленький вопрос, картинка капчи немного выше формы её ввода, их как-то можно разместить в одну линию? Спасибо!
Здравствуйте, Антон!
Установите код и дайте мне ссылку.
Я вам скажу далее, что прописать в CSS, чтобы капча спустилась ниже.
Код установил
В CSS пропишите:
Всё сделал точь в точь, но почему-то картинки для капчи не отображаются в форме Папка с картинками находится в корневой директории, так же как и всё остальное…
Вы для вордпресса хотите вставить капчу?
Нет, вообще без CMS. Капча для статичной страницы.
Здравствуйте! А как прикрутить кнопку обновления к вашей капче?
перепроверьте название папки, где лежат картинки. Папка должна называться “images”.
А лучше, дайте ссылку, где Вы установили капчу, я посмотрю в исходном коде.
Здравствуйте! Вы можете воспользоваться событиями HTML5
Добрый день, вопрос картинки с изображениями не понял в какую папку сохранять , не увидел путь к изображениям. Спасибо
Здравствуйте, Олег!
Пункт №7:
то есть, в корневую папку “images”
Здравствуйте! У Вас ссылка на изображения с цифрами битая – ведет на ya.ru можете исправить?
Здравствуйте. Спасибо, исправил!
Здравствуйте. Всё работает, спасибо. А как можно добавить к форме возможность прицепить файл (текстовый или картинку)?
Здравствуйте, у вас папки zip пустые.
Здравствуйте.
Это у Вас что-то с архиватором.
Здравствуйте.
Форма обратной связи
Двеннадцатая строка, закрывающий тег зачем?
Здравствуйте.
Конкретней, в каком коде?
Если Вы про это “?>”, тогда откройте основы php.
Можно обойтись и “echo” было, но зачем…