Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

"Введите число, изображенное на картинке"

Владимир Максименко, 4raznoe@mail.ru
www.voldemar.info
12.07.2004

В статье описан метод защиты от автоматического заполнения и отправки формы с сайта путем динамической генерации картинки с кодом и подтверждения правильности ввода.

Как это работает

Когда происходит заполнения полей с данными, система просит пользователя указать код, который он видит на картинке.

После проверки правильности ввода происходит решение - пускать клиента в систему или нет.

Большой плюс такого метода - надежность. "Вскрыть" картинку и найти в ней цифры не так-то просто, потому что здесь придется писать сложный анализатор изображения.

Алгоритм работы

  • генерируем случайное число с заданным количеством разрядов или слово из словаря (будет использоваться как надпись на картинке) - пароль
  • создаем случайный код сессии
  • во временном каталоге создаем файл с именем сессии, внутри содержится сгенерированный пароль
  • не забываем удалять старые файлы сессий, время жизни которых истекло - неудачные попытки авторизации
  • в заполняемой пользователем форме вставляем hidden поле с кодом сессии и поле ввода пароля
  • генерируем и показываем на странице подготовленную картинку с паролем (делаем ее трудночитаемой для возможных анализаторов, но понятной человеку)
  • после отправки заполненной формы сравниваем содержимое файла сессии с введенным паролем, если значения совпадают - значит форму заполняет человек, вносим данные
  • удаляем файл завершившейся сессии

Замечания по реализации

Сначала была мысль не использовать файлы сессий, а передавать в форме в hidden поле зашифрованный по MD5 пароль или обойтись просто созданием временных файлов с именами-значениями пароля, и проверять только их наличие.

Но решил все же делать с запасом надежности.

Случайный пароль для картинки

$kol_digit=5;
@pass_chars=(0..9);

srand();
$password=join("", @pass_chars[map {rand @pass_chars}(1..$kol_digit)]);

Не забываем раскручивать генератор случайных чисел.

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

@pass_chars=("A".."Z", "a".."z", 0..9, qw(% ! $ % ^ & *));

Также можно использовать слова и куски текста из словаря.

Шифрованный код сессии

Используется модуль Perl Digest::MD5 (http://search.cpan.org/dist/Digest-MD5/)

Уникальная строка для шифрования - текущее время в raw-формате, а также процесс скрипта.

 $salt=Digest::MD5->new;
 $hash = $salt->add(time().$$);
# шифруем методом ASCII-HEX
 $session_code=$hash->hexdigest;

Подготовленная картинка с паролем

Картинка отображается на странице как STDOUT работы небольшого скрипта, генерирующего картинку, код сессии передаем скрипту как параметр

<img align="right"
     src="/cgi-bin/anti_robot_img.cgi?code=<session_code>"
     border=1
     alt="">

Если параметр не задан - генерируется картинка со случаным паролем.

Для создания и вывода картинки используется модуль Image::Magick (http://www.imagemagick.org/)

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

После этого "зашумляем" изображение - сверху в случайных местах разбрасываем разноцветные точки.

Можно еще добавить вывод букв разными шрифтами и цветами, а также использовать разноцветный фон (например кусочки фотографий)

Исходники модуля можно взять по адресу http://voldemar.info/files/anti_robot_img.pm

Система успешно применяется на сайте "ПРАЙСЫ online" в разделе "Доска объявлений" http://www.price-list.kiev.ua/cgi-bin/msg_board.cgi?do=add-msg

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

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
Аноним
+1 / -0
Мне нравитсяМне не нравится
22 февраля 2006, 13:14:35
Для ActiveState Perl просто ставишь ImageMagick, он сам установит PerlMagick.
2.
Аноним
Мне нравитсяМне не нравится
8 февраля 2006, 10:55:35
Ребят! а есть у кавонить пример на АСПе
3.
Аноним
+1 / -0
Мне нравитсяМне не нравится
23 января 2006, 17:04:49
сложный анализатор изображения говорите? :-)
например для этого сайта http://www.codenet.ru чтобы оставить комментарий тоже надо ввести число на картинке, от шумов избавиться не просто, а очень просто: точки изображения в которых r=g=b изменить на r=g=b=255, то что получится скормить gocr :-)
4.
Аноним
Мне нравитсяМне не нравится
30 июля 2005, 19:22:49
Хорошая статья. Спасибо.
А как быть, если используется ActivePerl? Там насколько я помню модуль Image::Magick не работал...
5.
Аноним
Мне нравитсяМне не нравится
21 октября 2004, 13:25:00
Идея давно известная именутся CAPTCHA (Completely Automated Public Turning test to tell Computers and Humans Apart) почитать можно на captcha.org
существует перловый модуль реализующий эту технологию Authen::Captcha
http://search.cpan.org/~unrtst/Authen-Captcha-1.023/Captcha.pm
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог