Одним из способов защиты форм от спама может служить капча. Сегодня в статье мы напишем и разберем по пунктам одну из простых реализаций её на PHP.
При написании любого приложения, сначала необходимо наметить его логику. Заключаться она будет в двух файлах:
- В первом файле мы будем выводить капчу и проверять её на совпадение;
- Во втором файле будет находиться скрипт генерирующий её (капчу).
В скрипте нам необходимо будет работать с графикой, поэтому потребуется расширение php_gd2. Если оно у вас подключено, то можно начинать писать сам скрипт.
Написание скрипта
В самом начале файла мы запустим сессию и опишем все необходимые переменные, которые будут использоваться в дальнейшем.
- $count_chars = 7, число символов в капче;
- $rand_size = rand(14, 30), случайный размер шрифта;
- $rand_angle = rand(0, 45), случайный угол наклона букв;
- $x = 20 и $y = 40, координаты букв;
- $shift_x = 35, смещение по x.
После того как мы описали переменные можно начинать работать с расширением php_gd2. Первым делом создадим новое изображение из картинки и получим его идентификатор, это будет задний фон нашей капчи.
$img = imageCreateFromJPEG("bg.jpg");
В следующей строке мы выберем цвет для символов, передав значение идентификатора изображения и указав сам цвет.
$color = imageColorAllocate($img, 0, 0, 0);
Далее нам нужно сгенерировать случайную строку размером в 7 символов. Для этого можно использовать фикцию uniqid(), которая сама по себе возвращает уникальный id, но для большей уникальности я её оберну ещё в md5() и base64_encode(). В итоге всей этой магии получиться максимально уникальная строка с набором цифр, больших и малых букв. После этого остается обрезать её до нужного нам размера и сохранить в сессию.
$captcha = substr(base64_encode(md5(md5(uniqid()))), 0, $count_chars);
$_SESSION["captcha"] = $captcha;
После того как мы сохранили строку в сессию, нам осталось от-рисовать буквы на фоне и передать изображение на страницу с формой.
Для от-рисовки мы будем использовать цикл for. При каждой итерации которого, будет вызваться функция imageTtfText(), смещая символ по координате x.
for($i = 0; $i < $count_chars; $i++){
imageTtfText($img, $rand_size, $rand_angle, $x, $y, $color, "bellb.ttf", $captcha{$i});
$x += $shift_x;
}
Картинка готова, теперь её надо передать на страницу, так как мы сгенерировал всё на лету обязательно нужно сообщить браузеру, что это изображение. Сделать это можно при помощи заголовков указав тип файла image/jpeg.
header("Content-Type: image/jpeg");
Для завершения работы вызываем функцию imageJPEG(), передав идентификатор и коэффициент сжатия. Второй параметр мы не будем использовать, так как в нём указывается путь до места сохранения файла.
imageJPEG($img, null, 60);
Проверка капчи
Выводить сгенерированную картинку мы будем при помощи HTML элемента img, указав в его атрибуте src путь до скрипта.
<img src="captcha.php" />
Далее мы напишем простой обработчик, который будет получать введенные данные с формы и сравнивать их со значением из сессии, выдавая соответствующие сообщения, не забывая, конечно, продолжить сессию на этой же странице.
session_start();
if($_SERVER["REQUEST_METHOD"] == "POST"){
if($_SESSION["captcha"] == $_POST["text"])
$msg = "ок";
else
$msg = "ошибка";
}
После выводим сообщение в нужном месте.
<form action="" method="post">
<img src="captcha.php" />
<div>
<label>Введите Капчу :</label>
<input type="text" name="text" size="15" />
<?php echo $msg; ?>
</div>
<input type="submit" value="OK" />
</form>
В результате всех проделанных действий у вас получиться рабочая капча, которую можно будет легко использовать в своих проектах. Сам же скрипт капчи можно, конечно, существенно усовершенствовать в зависимости от потребностей.