В данной статье вы можете познакомиться с интересным и актуальным способом защиты от роботов в Интернете и научитесь реализовывать его на языке PHP.
Что такое CAPTCHA?
CAPTCHA расшифровывается как Completely Automated Public Turing test to tell Computers and Humans Apart, что в переводе означает «полностью автоматизированный публичный тест Тьюринга для различия компьютеров и людей» — компьютерный тест, используемый для того, чтобы определить, кем является пользователь системы: человеком или компьютером.
Термин появился в 2000 году. Основная идея теста: предложить пользователю такую задачу, которая с лёгкостью решается человеком, но крайне сложна и трудоёмка для компьютера.
CAPTCHA является очень эффективным методом защиты от накрутки, флуда или спама. После каждой попытки проголосовать, пользователю приходиться в очередной раз вводить код или отвечать на вопрос, поэтому, чтобы отдать 1000 голосов за интересующий ответ, придется 1000 раз проходить тест.
В реальных проектах я рекомендую использовать Google Captcha. Данная компания разработала достаточно хороший API, который можно использовать для того, чтобы обеспечить защиту своих сайтов.
Пример реализации на PHP
Для примера сделаем «капчу» цифрами, нарисованными на картинке, и добавим на неё шум. Для этого в PHP можно программно создать картинку и нарисовать на ней цифры и шум. Примеры выбора шума:
- Можно покрыть цифры и фон точками, только точек для создания полноценного шума понадобится очень много;
- Для создания шума можно использовать графический алгоритм, примерно как в Adobe Photoshop есть фильтр для превращения картинки в шум;
- Можно заранее подготовить картинку с шумом и рисовать секретный код на её поверхности. Но из-за того что картинка фона статична, вполне реально написать сценарий, который программно будет очищать изображение от шума;
- Можно нарисовать несколько линий поверх секретного кода. И также злоумышленник может написать сценарий, который будет распознавать линии на изображении и удалять их.
Если Ваш сайт очень популярен, тогда надо создавать более серьезную и сложную «капчу» я же для примера возьму последний способ создания теста на сайте. И так создадим файл captcha.php и запишем в него содержимое листинга:
<?php
session_start();//Запуск сессии
header("Content-type: image/png");
$img = imagecreatetruecolor(130,24) or die('Cannot create image');
imagefill($img, 0, 0, 0xFFFFFF);
$x=0;
$i=1;
$sum = "";
while ($i++ <= 5) {
imagettftext($img, rand(14,18), rand(-12,12), $x=$x+20, 15+rand(0,5),
imagecolorallocate($img,rand(0,$i*25),rand(0,$i*25),rand(0,$i*25)), "arial.ttf", $rnd=rand(0,9));
$sum = $sum.(string)$rnd; //шрифт arial.ttf или любой другой должен лежать в папке с этим файлом
imageline($img, 0, rand(0,24), 130, rand(0,40), $DDDDDD);
}
$_SESSION[secret_number] = $sum;
imagepng($img);
imagedestroy($img);
?>
Рассмотрим код подробно. Сразу после запуска сеанса мы вызываем функцию header(). Сделать это следует до вывода какой бы то ни было информации, потому что она задает заголовок последующих данных.
В header() указываем в качестве параметра "Content-type: image/png". Данный тип заголовка определяет картинку в формате PNG, и именно её мы должны сгенерировать в сценарии.
Далее вызывается функция imagecreatetruecolor(), которая создает картинку в памяти сервера. В качестве параметров передаются требуемые ширина и высота картинки. Функция imagefill() заполняет всю область картинки белым цветом.
После создания фона запускаем цикл из пяти шагов, на каждом шаге которого рисуем одну случайную цифру и линию со случайными координатами. В том же цикле добавляем к переменной $sum нарисованную цифру. В этой переменной собираем сгенерированный код защиты в одно целое.
В header() указываем в качестве параметра "Content-type: image/png". Данный тип заголовка определяет картинку в формате PNG, и именно её мы должны сгенерировать в сценарии.
Далее вызывается функция imagecreatetruecolor(), которая создает картинку в памяти сервера. В качестве параметров передаются требуемые ширина и высота картинки. Функция imagefill() заполняет всю область картинки белым цветом.
После создания фона запускаем цикл из пяти шагов, на каждом шаге которого рисуем одну случайную цифру и линию со случайными координатами. В том же цикле добавляем к переменной $sum нарисованную цифру. В этой переменной собираем сгенерированный код защиты в одно целое.