Капча на 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'] );
Пример капчи вы можете посмотреть, добавив комментарий к этой статье.
Созданную капчу вы всегда сможете усложнить, используя разные шрифты, добавляя искажения и шумы, меняя цвета и фон. Важно помнить, что необходимо искать компромисс между защищенностью капчи и ее читаемостью, иначе не только боты, но и обычные посетители не смогут оставить свой отзыв о вашем сайте.