QAlt / Полезные статьи, скрипты / 13 ноября 2013г, среда

Капча (CAPTCHA) на PHP

Сегодня ни одного пользователя Интернет не удивишь капчей (или CAPCHA, от англ. Completely Automated Public Turing test to tell Computers and Humans Apart — полностью автоматизированный публичный тест Тьюринга для различения компьютеров и людей). Каждый, кто хоть раз регистрировался на каком-нибудь форуме, крупном сервисе или просто оставлял где-то комментарий, обязательно вводил непонятные букво-циферные коды. Для чего эти коды? Они препятствуют ботам совершать различные действия по распространению спама.

В этой статье мы разберёмся, как же работает капча. А для начала несколько примеров капч:

    

Капчи бывают плохочитаемые и нечитаемые! =)

Так, чем сложнее капча, тем сложнее её распознать не только роботу, но и человеку.

Как работает captha

  • На сервере автоматически генерируется случайный код, и создаётся картинка с этим кодом.
  • Код запоминается в сессию.
  • Затем, картинка деформируется, искажается и добавляются шумы.
  • Готовая картинка показывается пользователю в браузере.
  • После отправки формы введённые символы сравниваются с символами в сессии, если они совпали, значит код капчи введён верно.

Пишем свою капчу

Готовый вариант можно потестировать тут.

Проще всего генерацию капчи вынести в отдельный файл, который будет на выходе отдавать готовую картинку. 

Приступим...

Создадим 3 файла:

  1. index.html - тут будет форма для ввода капчи
  2. capcha.php - генерация капчи
  3. result.php - проверка на правильность введённого кода

index.html

<html>
<body>
  <form action="result.php" method="post">
    <img src="captcha.php" />
    <input type="text" name="code" value="" />
    <input type="submit" value="Отправить" />
  </form>
</body>
</html>

captcha.php

<?php

session_start();       //включаем сессию

$width = 100;          //Ширина изображения
$height = 50;          //Высота изображения
$font_size = 16;       //Размер шрифта
$let_amount = 4;       //Количество символов, которые нужно набрать
$fon_let_amount = 30;  //Количество символов на фоне
$font = "OPTIMA.TTF";  //Путь к шрифту

//набор символов
$letters = array("a","b","c","d","e","f","g","k","m","n","p","r","s","t","u","w","x","y","z","3","4","6","7","8","9"); 

//цвета
$colors = array("90","110","130","150","170","190","210");

$src = imagecreatetruecolor($width,$height);  //создаем изображение 
$fon = imagecolorallocate($src,255,255,255);  //создаем цвет фона
imagefill($src,0,0,$fon);                     //заливаем изображение фоновым цветом

//добавляем на фон маленькие буковки для шума
for ($i=0; $i < $fon_let_amount; $i++) 
{
  //случайный цвет
  $color = imagecolorallocatealpha($src,rand(0,255),rand(0,255),rand(0,255),100);

  //случайный символ
  $letter = $letters[rand(0,sizeof($letters)-1)];

  //случайный размер 
  $size = rand($font_size-2,$font_size+2);

  //рисуем символ со случайным смещением и случайным углом наклона
  imagettftext($src,
               $size,
               rand(0,45),
               rand($width*0.1,$width-$width*0.1),
               rand($height*0.2,$height),
               $color,
               $font,
               $letter);
}

$code = array();

//то же самое для основных букв
for ($i=0; $i < $let_amount; $i++)
{
  $color = imagecolorallocatealpha($src,$colors[rand(0,sizeof($colors)-1)],
  $colors[rand(0,sizeof($colors)-1)],
  $colors[rand(0,sizeof($colors)-1)],rand(20,40));
  $letter = $letters[rand(0,sizeof($letters)-1)];
  $size = rand($font_size*2-2,$font_size*2+2);
  $x = ($i+1)*$font_size + rand(1,5);    //даем каждому символу случайное смещение
  $y = (($height*2)/3) + rand(0,5);      //           относительно центра картинки

  $code[] = $letter; //запоминаем код
  imagettftext($src,$size,rand(0,15),$x,$y,$color,$font,$letter);
}

$code = implode("",$code);     //склеиваем символы в одну строку
$_SESSION['captcha'] = $code;  //запоминаем код в сессию 

header ("Content-type: image/gif"); //выводим заголовок картинки
imagegif($src);                     //выводим саму картинку

?>

result.php

<?php

session_start();  //включаем сессию

if (isset($_POST['code']))  //если отправлена форма
{
  if ($_POST['code'] == $_SESSION['captcha'])
  {
    echo "Код введён ВЕРНО!";
  }else{
    echo "Допущена ОШИБКА!";
  }
}

?>

Вот и всё, защита от спам-ботов готова к применению. Конечно она не гарантирует 100% избавление от роботов, но существенно упростит работу модераторам.

Список всех статей »

home

Quality Alt
Разработка сайтов и
web-интерфейсов

8 923 232-88-90