Капча на PHP и gd2

Там где посетитель может что-то написать, там и появляется надоедливый спам. На многих ресурсах для защиты от ботов — скриптов, оставляющих спам на сайте, используют капчу.

CAPTCHA — это аббревиатура от английских слов "Completely Automatic Public Turing Test to Tell Computers and Humans Apart" — полностью автоматический тест Тьюринга для различения компьютеров и людей. Иными словами, это задача, которую легко решает человек, но которую невозможно (или крайне трудно) научить решать компьютер. На сегодня задача распознавания речи или изображения техническими средствами нетривиальна и не всегда дает 100%-ый результат.

Применяются CAPTCHA для того, чтобы предотвратить множественные автоматические регистрации и отправления сообщений программами-роботами. Т. е. задача CAPTCHA — защита от спама, флуда и захвата аккаунтов.

Чаще всего CAPTCHA выглядит как тем или иным образом зашумленное случайное число, слово или иная надпись, которую пользователю нужно прочитать и ввести прочитанный результат, хотя существуют и другие алгоритмы.

Конечно, капча — это не панацея, и она не защитит вас от пользователей, рассылающих спам, и создаст определенные трудности обычным пользователям. Но пыт показывает, что использование даже самой простой капчи резко снижает количество спама. Для ресурсов с небольшой посещаемостью достаточно будет и простой капчи, в то время как для популярных порталов следует использовать более сложные алгоритмы генерирования проверочного кода в купе с другими методиками.

Вы можете использовать популярную библиотеку для генерирования капчи, которая использует сложные алгоритмы и простые настройки. Но скорее всего, спамеры уже взломали эту капчу. Поэтому имеет смысл сделать свою капчу и заодно разобраться в принципах ее работы.

Про алгоритм работы капчи доступно написано здесь (http://www.captcha.ru/articles/algorithm/), рядом (http://www.captcha.ru/articles/visual/) — про построение защищенной надписи и приведены удачные и неудачные примеры.

Генерация капчи — процесс достаточно простой и сейчас вы в этом убедитесь: 

//captcha.php
//количество символов в капче
$captcha_length = 6;

//создаем изображение 245 пикселей на 30
$img_handle = @ImageCreate ( 245, 30 );

//задаем цвет фона
$back_color = @ImageColorAllocate ( $img_handle, 255, 255, 255 );
$code = "";

//для каждого символа в коде
for($i = 0; $i < $captcha_length; $i ++) {
	
//устанавливаем произовальные координаты символа
	$x_axis = 90 + ($i * 10);
	$y_axis = 5 + rand ( 0, 7 );

	//задаем произовальный цвет символа
	$color1 = rand ( 001, 150 );
	$color2 = rand ( 001, 150 );
	$color3 = rand ( 001, 150 );
	$txt_color [$i] = @ImageColorAllocate ( $img_handle, $color1, $color2, $color3 );

	//задаем произовольный размер символа
	$size = rand ( 3, 5 );

	//генерируем символа кода
	//в данном случае — числа от 0 до 9
	$number = rand ( 0, 9 );
	$code .= "$number";

	//печатаем символ на картинке
	ImageString ( $img_handle, $size, $x_axis, $y_axis, "$number", $txt_color [$i] );
}

//запоминаем проверочный код  в сессии
$_SESSION ['captcha'] = $code;

//запрещаем кеширование изображения
header ( "Cache-Control: no-cache" );

//сообщаем браузеру, что выводим изображение png
header ( "Content-type: image/png" );

//выводим капчу
ImagePng ( $img_handle );
exit ();

В форму с капчей добавляем дополнительное поле для ввода капчи, саму капчу и ссылку для обновления капчи:

<img alt="" id="captcha" src="/captcha.php" />
<span onclick="document.getElementById('captcha').src=document.getElementById( 'captcha').src + '?' + Math.rand();”>обновить код</span>
<input type="text" maxlength="<?=$captcha_length;?>" style="text-align: center;" autocomplete="off" name="captcha" value=""/>

А в скрипт обработки формы добавим проверку капчи:

if (isset ( $_SESSION ['captcha'], $_POST ['captcha'] ) && $_SESSION['captcha'] !== $_POST ['captcha'])
	die('Проверочный код введен неверно');
unset ( $_SESSION ['capthca'] );

Пример капчи вы можете посмотреть, добавив комментарий к этой статье.

Созданную капчу вы всегда сможете усложнить, используя разные шрифты, добавляя искажения и шумы, меняя цвета и фон. Важно помнить, что необходимо искать компромисс между защищенностью капчи и ее читаемостью, иначе не только боты, но и обычные посетители не смогут оставить свой отзыв о вашем сайте.

Комментарии (4)
  • витя
    |
    19.03.2019, 21:55
    "Пример капчи вы можете посмотреть, добавив комментарий к этой статье" - чтобы спамить в комментах ради того, чтобы пример увидеть? Бред какой-то.
  • Nick
    |
    30.01.2021, 11:37
    1234567890
  • Zen
    |
    02.04.2021, 17:38
    куда его нужно подключить код этот? if (isset ( $_SESSION ['captcha'], $_POST ['captcha'] ) && $_SESSION['captcha'] !== $_POST ['captcha'])die('Проверочный код введен неверно');unset ( $_SESSION ['capthca'] ); можете оставить исходники?
Комментировать
Обновить проверочный код