Сегодня кое-что о защите сайта от роботов. На сегодняшний день наиболее эффективным способом остается использование картинки, которую предлагается «распознать» и напечатать результат в соответствующем поле. То есть закрыть действие на капчу. Самая распространенная ситуация: защитить от спам-роботов комментарии, или регистрацию на вашем сайте.
Ну, поскольку сайты чаще всего строятся на PHP, то и наша функция будет реализована именно на этом языке программирования.
Предлагаемый ниже способ позволяет генерировать вот такие замечательные картинки:
Поскольку фон состоит из букв и цифр, то «распознать» такую капчу с помощью компьютера будет довольно затруднительно. То есть, она обеспечивает сравнительно высокую степень защиты.
Давайте перейдем непосредственно к коду и разберем в комментариях что и как:
- function showcaptcha()
- {
- //Указываем путь к папке, где у нас лежит шрифт
- $path = $_SERVER[‘DOCUMENT_ROOT’] . ‘/fonts/’;
- $width = 200; //Ширина капчи
- $height = 60; //Высота
- $font_size = 16; //Размер шрифта
- $let_amount = 6; //Количество символов в нашей капче
- $fon_let_amount = 100; //Количество знаков, составляющих фон
- $font = $path.«cour.ttf»; //Непосредственно путь к шрифту
- /* Набираем алфавит, из которого будем генерировать случайным
- * образом текст на нашей картинке. При этом исключаем похожие
- * символы для удобства пользователей. Например 1 и I
- */
- $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);
- //Ну тут, так сказать, гамма из которой генерируется цвет буквы
- $colors = array(«90»,«110»,«130»,«150»,«170»);
- $src = imagecreatetruecolor($width,$height); //Создаем холст
- $fon = imagecolorallocate($src,255,255,255); //Генерируем белый цвет. Так положено.
- imagefill($src,0,0,$fon); //Заполняем им холст. Чтобы не прозрачным был.
- for($i=0; $i < $fon_let_amount; $i++) //Генерируем фон
- {
- /* Определяем цвет буквы случайным образом.
- * Первым параметром идет холст. Потом цвет в формате RGB. Затем прозрачность,
- * чтобы наш фон не «забивал» основные буквы.
- */
- $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);
- /* Ну здесь происходит непосредственно выбранной ранее буквы, выбранным цветом.
- * Объяснять что означает каждый параметр не буду, вы можете сами почитать:
- * http://php.net/manual/ru/function.imagettftext.php
- */
- imagettftext($src,$size,rand(0,45),
- rand($width*0.1,$width—$width*0.1),
- rand($height*0.2,$height),$color,$font,$letter);
- }
- // Аналогичным образом генерируем основные буквы капчи
- 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*1.5 + rand(1,5);
- //Здесь генерируем сдвиг по вертикали. Чтобы буквы «плясали» вверх-вниз
- $y = (($height*2)/3) + rand(0,5);
- /* Сохраняем каждую букву в массив. Потом соединим в строку.
- * Можно и сразу фигачить конкатенацией, но я не очень люблю
- */
- $cod[] = $letter;
- //Печатаем букву, как и в прошлый раз с фоном.
- imagettftext($src,$size,rand(—20,20),$x,$y,$color,$font,$letter);
- }
- $cod = implode(«»,$cod); //Ну тут делаем из массива строку…
- /*Записываем набор символов в сессию. Ну или куда-нибудь сохраняем.
- * Не забудьте сессию стартовать сначала. Надеюсь, умеете? =)
- */
- $_SESSION[‘captcha’]=$cod;
- header («Content-type: image/gif»); //Отправляем заголовок браузеру.
- imagegif($src); //И выводим саму картинку.
- }
Потом где-нибудь на страничке пишем форму и рядышком что-то типа
- <img src=«/captcha.php» />
А в том файле вызов нашей функции как раз… И старт сессии сначала!
Как проверять капчу подробно объяснять не буду: берете значение из формы, сравниваете с тем, что у нас в сессии сохранено. Совпадает, значит хорошо. Нет — пишем что не верно введены символы с картинки.
Всем удачной борьбы с роботами!
Да, кстати, у вас естественно должна быть установлена библиотека GD.