Создаем простую капчу для защиты формы обратной связи
Давным давно я уже писал, как создать самую примитивную капчу, для защиты формы обратной связи. Сегодня я решил немного переписать эту капчу.
Основные изменения касаются процесса передачи секретного кода для проверки пользовательского ввода. В прошлой статье, секретный код передавался в скрытом поле вместе с формой, что существенно снижало эффективность защиты от СПАМА, так как этот код можно было без проблем распарсить и вытащить.
Оптимальным вариантом передачи секретного кода являются сессии. Итак, как и в прошлой статье нам понадобятся 10 изображений с цифрами от 0 до 9, которые будут иметь названия аналогичные своим изображенным цифрам. Скачать архив с картинками можно здесь.
Теперь давайте создадим файл с названием captcha.class.php, который будет содержать класс Captcha для работы с капчей:
<?php Class Captcha{ public $imgDir = 'images/'; // директория где хранятся изображения public $length = '5'; // количество цифр в капче public function __construct(){ } } ?>
Данный класс будет иметь 3 метода:
- __construct() - конструктор (вызывается при инициализации класса)
- 2. draw() - будет выводить изображение на экран
- 3. getKeyString() - возвращает секретный код
Итак, в __construct() нам необходимо сгенерировать секретный код и записать его в виде массива в переменную $this->keystring
public function __construct(){ $this->keystring=array(); for($i=0;$i < $this->length;$i++){ $this->keystring[] .= mt_rand(0,9); } }
Теперь чтобы вывести изображения на экран, необходимо пройтись по этому массиву и сгенерировать html-код картинок:
public function draw(){ $img = ''; foreach($this->keystring as $keystring){ $img .= '<img src="'.$this->imgDir.$keystring.'.gif" border="0">'; } return $img; }
Ну и для того чтобы получить этот секретный код используем метод getKeyString(), который записывает в одну строку сгенерированный массив
public function getKeyString(){ return implode($this->keystring); }
Теперь чтобы воспользоваться этим классом и защитить Вашу форму обратной связи, необходимо создать еще один файлик и назвать его captcha.php. Он будет иметь следующий код:
require "captcha.class.php"; //Подключаем класс капчи //Инициализируем капчу $captcha = new Captcha(); $_SESSION['keystring'] = $captcha->getKeyString(); echo $captcha->draw();
Первым делом запускаем сессию, инициализируем капчу. Затем записываем в сессию значение keystring, которое будет содержать секретный код и выводим изображения на экран.
Теперь в нужном Вам месте, где Вы хотите видеть капчу необходимо просто подключить файл captcha.php и запустить сессию. Делается это так:
<?php session_start();?> <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 require 'captcha.php';?> <input name="pr" style=" margin-bottom:11px" type="text" size="6" maxlength="5"></p> <p><input type="submit" class="bt1" value="Отправить сообщение"></p> </form>
Чтобы проверить правильность ввода капчи, необходимо в обработчике сделать следующую проверку:
if (isset($_POST['pr']) && $_POST['pr'] == $_SESSION['keystring']){ Проверка прошла успешно } else{ Вывод сообщения об ошибке. }
Скачать исходники можно здесь
Ну вот собственно и все! Удачи!
-
Комментарии (47)
- Сайт