This Might Be Useful

Создаем свою captcha

Большая часть владельцев сайтов наверняка сталкивалась со спамом в комментариях, автоматическими регистрациями на форумах и прочими подобными неприятными вещами. Защититься от этого отчасти помогает captcha - картинка, со случайным набором букв, которые надо ввести в качестве подтверждения того, что Вы не робот. Во многие популярные системы это уже встроено. А что делать тем, кто пишет свои продукты? Правильно, делать свою captcha. Тем более, что это просто.

PHP:
  1. <?php
  2.  
  3. // Создаем строку из трех случайных букв
  4. $codev = chr(rand(65, 90)).chr(rand(65, 90)).chr(rand(65, 90));
  5. // Сохраняем ее в сессию для того, чтобы потом проверить при обработке формы ввода
  6. $_SESSION['secure_code'] = $codev;
  7. // Создаем картинку, на которую положим буквы
  8. $im = imagecreatetruecolor(75, 28);
  9. // Заливаем картинку черным цветом
  10. $black = imagecolorallocate($im, 0, 0, 0);
  11. imagefill($im, 0, 0, $black);
  12. // Проходим по буквам
  13. for ($i = 0; $i < strlen($codev); $i++) {
  14.   // Создаем картиночку для одной буквы
  15.   $char = imagecreatetruecolor(14, 16);
  16.   // Заливаем ее черным цветом
  17.   $black = imagecolorallocate($char, 0, 0, 0);
  18.   imagefill($char, 0, 0, $black);
  19.   // Рисуем букву
  20.     $char,
  21.     rand(4, 5), // случайный из двух встроенных шрифтов
  22.     1,
  23.     1,
  24.     substr($codev, $i, 1),
  25.     imagecolorallocate($char, rand(150, 255), rand(150, 255), rand(150, 255)) // случайный цвет
  26.   );
  27.   // Попорачиваем букву под случайным углом
  28.   $char = imagerotate($char, rand(-20, 20), $black);
  29.   // Переносим ее на итоговую картинку со случайным сдвигом
  30.     $im,
  31.     $char,
  32.     20 + (14 * ($i - 1)) + rand(10, 15), // случайный x
  33.     5 + rand(-4, 3), // случайный y
  34.     0,
  35.     0,
  36.     14,
  37.     16
  38.   );
  39.   // Чистим мусор
  40.   imagedestroy($char);
  41. } // for - для всех букв
  42.  
  43. // Выдаем правильный заголовок
  44. header("Content-type: image/gif");
  45. // Отдаем картинку
  46. imagegif($im);
  47.  
  48. ?>

В результате получается картинка объемом около 700 байтов примерно такого вида: Пример captcha

· Создание прямой ссылки на Network Connections
· Создание скриншотов в Windows Vista с сохранением всех визуальных эффектов
· MySQL функция для конвертирования bigint IP адресов в удобоваримые varchar
· Динамическое создание обработчиков событий
· Создание PDF-файлов с помощью PHP и FPDF

- Коментировать
- Trackback

9 Responses to “Создаем свою captcha”


  1. Andrey Says:

    Не плохо было бы узнать как его вставить в форму? И что бы он не копил рисунки на серваке!

  2. Andrey Says:

    Т.е. без вот этого в форме:

    и этого в скрипте:
    imagegif($im, "code.gif");

  3. Filosoff Says:

    В общем-то на сервере картинки не сохраняются вообще. Это не нужно.

    Все намного проще. В форме пишете что-то типа:
    Введите код <img src="/captcha.php" alt="" />: <input type="text" name="captcha" value="" />

    А после submit'а проверяете совпадение $_REQUEST['captcha'] и $_SESSION['secure_code'].

  4. Andrey Says:

    У меня IE6 на Windows server 2003. Работает если сделать так в форме <?php print ""; ?> или сaptcha.php добавить session_cache_limiter();
    Помогло отсюда http://ru2.php.net/manual/en/function.imagegif.php

  5. Andrey Says:

    За код спасибо!

  6. Nikolai Says:

    Я не программист, и чего-то не пойму куда надо в форму вставлять проверку $_REQUEST['captcha'] и $_SESSION['secure_code'].
    Если допустим у меня страница на php, а запрос с формы проверяется JavaScript, как это можно реализовать в Jave?

  7. Filosoff Says:

    JavaScript Вам тут не поможет.
    Порядок действий простой: на странице в форме вставляете картинку вида <img src="captcha.php" alt="" /> (где captcha.php - файл, содержащий код из статьи) и <input type="text" name="thecode" value="" />. затем в скрипте, который обрабатывает данные, получаемые от формы, проверяете совпадение $_REQUEST['thecode'] и $_SESSION['secure_code']. если сони одинаковы - код введен правильно.

  8. Shadow Says:

    делаю так:
    captcha.php

    иначе в IE не работает!

  9. Shadow Says:

    делаю так:

    captcha.php

    $img = imagecreate... создаем удобным способом

    ... тут рисуем буковки или что там нам нужно.

    ob_start();
    ob_implicit_flush( 0 );
    imagejpeg( $img );
    $jpeg = ob_get_contents();
    ob_end_clean();

    imagedestroy( $img );

    header( 'Pragma: no-cache' );
    header( 'Cache-Control: no-cache, no-store, must-revalidate, private' );
    header( 'Expires: ' . gmdate( 'r', time() ) );
    header( 'Content-Length: ' . strlen( $jpeg ) );
    header( 'Content-Type: image/jpeg');

    print $jpeg;

    иначе в IE не работает!

Leave a Reply

code