Только для читателей Lifeexample возможно открыть интернет-магазин на Moguta.CMS со скидкой в 15%

<<< Админка сайта для интернет магазина || Список переменных php >>>

Капча на PHP

10.05.2012
Капча на PHP

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Скачать скрипт "капча на php" ( Скачали: 6935 чел. ) 

Давайте по порядку, первое что мы хотим сделать это вывести картинку, для этого в файле index.php Пишем такие строки:

1
2
3
4
5
6
7
8
Введите код с картинки:
<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.

Взглянем на код скрипта генерирующиего картинку:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$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 .

1
2
3
4
5
session_start();
if($_POST['capcha'] != $_SESSION['capcha'])
    echo "Текст с картинки введен не верно!";
else
    echo "Ура текст совпал!";

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

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

Скриншот php капчи

Скачать скрипт "капча на php" ( Скачали: 6935 чел. ) 

Спасибо за внимание , теперь вы знаете что такое капча на PHP и как её сделать своими руками. Все возникшие вопросы пишите в комментариях, будем разбираться вместе.

Чтобы не пропустить публикацию следующей статьи подписывайтесь на рассылку по E-mail или RSS ленту блога.

Нравится

Комментарии

  • rosomaha256

    Простенько но со вкусом. Можно ещё проверять на количество раз введенных данных и периодически менять шрифты, размеры и фон. Но для старта самое то 🙂

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

  • Андрей

    По вашему комментарию на MyRusakov отвечаю: как и в том примере недостаточно надежно, обойти капчу как и в прошлом случае очень легко. Одна из причин: использование стандартной сессии php.

  • ImLoaD

    Не предусмотрен механизм обновления картинки. 🙂

  • Samigo

    Мне надо было пораньше зайти к Вам.
    Я как «не очень ленивый» собрал около тысячи маленьких картинок для этой цели. 🙁
    За «captcha.php» — СПАСИБО!

    • Действительно, надо было бы по раньше))
      А зачем столько картинок то?

    • Samigo

      для капча картинки. чтобы много вариантов было. не умел генерировать картинки. Если честно, с картинками вообще не умею (пока) работать.

  • Иван

    как установить капчу

  • Вася

    Как добавить капчу в форму отправки комментариев

  • Васо

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

  • Наиль

    В общем, с одногруппником делаем сайт, мы вот сделали php страничку, одновременно проверяющую введенные логин пароль, одновременно являющуюся html страничкой (html код засунули в print ‘вот сюда’, по другому пока не умеем), в этом html у нас есть таблица — где находится 2 столбца, и строки логин/поле для ввода логина, пароль/поле для ввода пароля, все работает нормально, но когда я добавляю ваши

    1
    2
    3
    4
    5
    6
    7
    <tr>
    <td>Введите код с картинки:</td>
    <td><img style="border: 1px solid gray; background: url('bg_capcha.png');" src = "captcha.php" width="120" height="40"/></td>
    </tr>
    <tr>
    <td><input type="text" name="capcha" /></td>
    </tr>

    у нас страница в интернете перестает прогружаться, т.е тупо белый лист вместо нашего login.php.
    Не знаете, почему так может быть?

    • Смотря как и куда добавляете. Вставляйте в свой же print (вывод контента). Это обычный HTML он не может сломать приложение если корректно выводится.

  • Наиль

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

  • ALEXCHOV

    РЕСПЕКТ АВТОРУ ! РАБОТАЕТ !

  • Иван Данилов

    Валидатор лучше сделать:

    Чтобы люди не могли по 1000 раз вводить 1 и туже капчу.

  • Евгений

    здравствуйте а подскажите как добавить ее в форму обратной связи

    • Скопировать код и вставить в обработчик формы.

  • Евгений

    Как сделать чтобы были цифры, а не буквы?

    • замените первую строку в сткрипе

      1
      $letters = '0123456789'; // цифры
  • Константин

    почему-то не работает, при правильном наборе текста выдает на экран: «Текст с картинки введен не верно!»

  • Tasha

    Спасибо за помощь!!! Все работает!!!

  • у меня такая проблема: скачать капчу не проблема, а как подключить в адобе дримвивере 4, когда прописаны все выводы текста(сценарий) это проблема, я самоучка, и мне проще верстать сайты в программе, а вот подключить капчу не могу (( не понимау что куда подключать в сценарии. Кто может подскажите

    • Alex

      Ребята ну вы даете, автор же все подробно указал.
      Вот вставляете код хоть в свою страничку, хоть в дримвьювере.

      1
      2
      3
      4
      5
      6
      7
      8
      Введите код с картинки:
      <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>
  • Elena

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

  • Coder

    Класс

  • Иван

    Отличный пост, очень помог!

    Только вопрос остался открыт: как добавить кнопочку обновить капчу?) очень нужна..

    Спасибо

  • Fylhtq

    Почему невидно картинки, все сделал как тут а капчи не видно или это нужно отдельно картинки скачивать и вставлять ?

  • Оставить комментарий

    Подписаться на комментарии к этой статье по RSS

    Яндекс.Метрика