PHP

Капча на PHP



Здравствуйте, уважаемые читатели, сегодня я хочу выделить немного времени для ознакомления с нужным элементом для защиты сайта. Созданная, нами капча на PHP поможет вам защитить свой сайт от спама.

Перед тем как начать разработку капчи на PHP, давайте расставим все точки над i, и разберемся, откуда взялось это не понятное название и что оно означает.

Что такое капча

Сегодня задав, любому вебмастеру, вопрос: "Что такое капча?". Мы наверняка услышим: "Капча – это средство защиты от спам роботов". И в принципе это правильно, но давайте окунемся в историю, для того чтобы узнать более точный ответ на этот вопрос.

В начале 2000-х годов термин "КАПЧА", стал все чаще появляться на просторах всемирной паутины. Происхождение этого термина заслуга английского математика Алана Тюринга, который предложил в 1950 году эмпирический тест с целью определить сможет ли мыслить компьютер.

В те времена и по сей день, ученые и программисты многих университетов так и не создали искусственного интеллекта, эквивалентного человеческому разуму. Несмотря на это, труды Тюринга нашели отличное применение в полностью автоматизированном публичном тесте Тьюринга для различия компьютеров и людей (Completely Automated Public Turing test to tell Computers and Humans Apart ) сокращенно CAPCHA.

Теперь нам стало ясно, что слово КАПЧА – это лишь транскрипция аббревиатуры CAPCHA, скрывающей за собой длинную расшифровку.

Таким образом, отвечая на вопрос: "Что такое капча?", можно смело утверждать, что это тест для различия компьютеров и людей. А так как с помощью КАПЧИ мы можем точно определить, кто отправил ответ, человек или машина, то запросто применим это в своих целях.

Ну вот, я кажется удовлетворил свои писательские потребности, и могу приступить к созданию капчи на PHP.

Как сделать капчу

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

Мне необходимо было создать скрипт "Капча на PHP" требующий минимум усилий и отвечающий смыслу сей защиты.

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

Скрипт капчи на php
index.php – скрипт выводящий нашу капчу на PHP;
validator.php – скрипт проверяющий сходство с картинкой;
capcha.php – скрипт генерирующий картинку;
comic.ttf – шрифт текста;
bg_capcha.png – фон под текстом.

Давайте по порядку, первое что мы хотим сделать это вывести картинку, для этого в файле index.php Пишем такие строки:
Введите код с картинки:
<br/>
 <img style="border: 1px solid gray; background: url('bg_capcha.png');" src = "captcha.php" width="120" height="40"/>
<br/>
<form action="validator.php" method="POST">
     <input type="text" name="capcha" />
     <input type="submit" name="send" value="Проверить"/>
</form>

Тут стоит обратить внимание на указанный в атрибуте src, не характерный для него файл с расширением php. Все дело в том что файл captcha.php хоть и является скриптом, но возвращает ответ в виде изображения в формате png вполне подходящий для тега
img.

Взглянем на код скрипта генерирующиего картинку:
$letters = 'ABCDEFGKIJKLMNOPQRSTUVWXYZ'; // алфавит

  $caplen = 6; //длина текста
  $width = 120; $height = 40; //ширина и высота картинки
  $font = 'comic.ttf';//шрифт текста
  $fontsize = 14;// размер текста

  header('Content-type: image/png'); //тип возвращаемого содержимого (картинка в формате PNG) 

  $im = imagecreatetruecolor($width, $height); //создаёт новое изображение
  imagesavealpha($im, true); //устанавливает прозрачность изображения
  $bg = imagecolorallocatealpha($im, 0, 0, 0, 127); //идентификатор цвета для изображения
  imagefill($im, 0, 0, $bg); //выполняет заливку цветом
  
  putenv( 'GDFONTPATH=' . realpath('.') ); //проверяет путь до файла со шрифтами

  $captcha = '';//обнуляем текст
  for ($i = 0; $i < $caplen; $i++)
  {
    $captcha .= $letters[ rand(0, strlen($letters)-1) ]; // дописываем случайный символ из алфавила 
    $x = ($width - 20) / $caplen * $i + 10;//растояние между символами
    $x = rand($x, $x+4);//случайное смещение
    $y = $height - ( ($height - $fontsize) / 2 ); // координата Y
    $curcolor = imagecolorallocate( $im, rand(0, 100), rand(0, 100), rand(0, 100) );//цвет для текущей буквы
    $angle = rand(-25, 25);//случайный угол наклона 
    imagettftext($im, $fontsize, $angle, $x, $y, $curcolor, $font, $captcha[$i]); //вывод текста
  }

  // открываем сессию для сохранения сгенерированного текста
  session_start();
  $_SESSION['capcha'] = $captcha;

  imagepng($im); //выводим изображение
  imagedestroy($im);//отчищаем память

Все комментарии я старательно указал в теле скрипта, нам остается только проговорить механизм проверки введенного текста с тем который был сгенерирован капчей. Кстати полученный текст до вывода, мы сохранили в сессионную переменную, для того чтобы в дальнейшем произвести сравнение в файле validator.php, на который отправляется введенный текст из формы в index.php .
session_start();
if($_POST['capcha'] != $_SESSION['capcha']) 
    echo "Текст с картинки введен не верно!";
else
    echo "Ура текст совпал!";

Сама проверка как видите, тривиальна, но в реальности вместо этих сообщений, можно вставить необходимые алгоритмы, например для сохранения комментария, переданного вместе с проверочным текстом.

В результате у меня получился легковесный, и легко встраиваемый скрипт капчи на PHP



Спасибо за внимание , теперь вы знаете что такое капча на PHP и как её сделать своими руками. Все возникшие вопросы пишите в комментариях, будем разбираться вместе.
Теги:
Капча
Добавлено: 28 Сентября 2013 10:42:04 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...