Рисуем простую капчу на PHP

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

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

Предлагаемый ниже способ позволяет генерировать вот такие замечательные картинки:
captcha

Поскольку фон состоит из букв и цифр, то «распознать» такую капчу с помощью компьютера будет довольно затруднительно. То есть, она обеспечивает сравнительно высокую степень защиты.

Давайте перейдем непосредственно к коду и разберем в комментариях что и как:

  1. function showcaptcha()
  2. {
  3. //Указываем путь к папке, где у нас лежит шрифт
  4. $path = $_SERVER[‘DOCUMENT_ROOT’] . ‘/fonts/’;
  5. $width = 200; //Ширина капчи
  6. $height = 60; //Высота
  7. $font_size = 16; //Размер шрифта
  8. $let_amount = 6; //Количество символов в нашей капче
  9. $fon_let_amount = 100; //Количество знаков, составляющих фон
  10. $font = $path.«cour.ttf»; //Непосредственно путь к шрифту
  11. /* Набираем алфавит, из которого будем генерировать случайным
  12. * образом текст на нашей картинке. При этом исключаем похожие
  13. * символы для удобства пользователей. Например 1 и I
  14. */
  15. $letters = array(«a»,«b»,«c»,«d»,«e»,«f»,«g»,«h»,«i»,«j»,«k»,«m»,«n»,«p»,«q»,«r»,«s»,«t»,«u»,«v»,«w»,«x»,«y»,«z»,2,4,5,6,7,8,9);
  16. //Ну тут, так сказать, гамма из которой генерируется цвет буквы
  17. $colors = array(«90»,«110»,«130»,«150»,«170»);
  18. $src = imagecreatetruecolor($width,$height); //Создаем холст
  19. $fon = imagecolorallocate($src,255,255,255); //Генерируем белый цвет. Так положено.
  20. imagefill($src,0,0,$fon); //Заполняем им холст. Чтобы не прозрачным был.
  21. for($i=0; $i < $fon_let_amount; $i++) //Генерируем фон
  22. {
  23. /* Определяем цвет буквы случайным образом.
  24. * Первым параметром идет холст. Потом цвет в формате RGB. Затем прозрачность,
  25. * чтобы наш фон не «забивал» основные буквы.
  26. */
  27. $color = imagecolorallocatealpha($src,rand(0,255),rand(0,255),rand(0,255),100);
  28. //Выбираем случайным образом букву
  29. $letter = $letters[rand(0,sizeof($letters)1)];
  30. //Делаем буквы чуточку разными по размеру
  31. $size = rand($font_size2,$font_size+2);
  32. /* Ну здесь происходит непосредственно выбранной ранее буквы, выбранным цветом.
  33. * Объяснять что означает каждый параметр не буду, вы можете сами почитать:
  34. * http://php.net/manual/ru/function.imagettftext.php
  35. */
  36. imagettftext($src,$size,rand(0,45),
  37. rand($width*0.1,$width$width*0.1),
  38. rand($height*0.2,$height),$color,$font,$letter);
  39. }
  40. // Аналогичным образом генерируем основные буквы капчи
  41. for($i=0;$i < $let_amount;$i++)
  42. {
  43. //Генерируем цвет по нашей «гамме».
  44. $color = imagecolorallocatealpha($src,$colors[rand(0,sizeof($colors)1)],
  45. $colors[rand(0,sizeof($colors)1)],
  46. $colors[rand(0,sizeof($colors)1)],rand(20,40));
  47. $letter = $letters[rand(0,sizeof($letters)1)];
  48. //Здесь уже покрупнее делаем
  49. $size = rand($font_size*22,$font_size*2+2);
  50. //А это сдвиг буквы. Пытаемся сделать его случайным
  51. $x = ($i+1)*$font_size*1.5 + rand(1,5);
  52. //Здесь генерируем сдвиг по вертикали. Чтобы буквы «плясали» вверх-вниз
  53. $y = (($height*2)/3) + rand(0,5);
  54. /* Сохраняем каждую букву в массив. Потом соединим в строку.
  55. * Можно и сразу фигачить конкатенацией, но я не очень люблю
  56. */
  57. $cod[] = $letter;
  58. //Печатаем букву, как и в прошлый раз с фоном.
  59. imagettftext($src,$size,rand(20,20),$x,$y,$color,$font,$letter);
  60. }
  61. $cod = implode(«»,$cod); //Ну тут делаем из массива строку…
  62. /*Записываем набор символов в сессию. Ну или куда-нибудь сохраняем.
  63. * Не забудьте сессию стартовать сначала. Надеюсь, умеете? =)
  64. */
  65. $_SESSION[‘captcha’]=$cod;
  66. header («Content-type: image/gif»); //Отправляем заголовок браузеру.
  67. imagegif($src); //И выводим саму картинку.
  68. }

Потом где-нибудь на страничке пишем форму и рядышком что-то типа

  1. <img src=«/captcha.php» />

А в том файле вызов нашей функции как раз… И старт сессии сначала! ?

Как проверять капчу подробно объяснять не буду: берете значение из формы, сравниваете с тем, что у нас в сессии сохранено. Совпадает, значит хорошо. Нет — пишем что не верно введены символы с картинки.

Всем удачной борьбы с роботами!

Да, кстати, у вас естественно должна быть установлена библиотека GD.