Введите число, изображенное на картинке
В статье описан метод защиты от автоматического заполнения и
отправки формы с сайта путем динамической генерации картинки с кодом
и подтверждения правильности ввода.
Как это работает
Когда происходит заполнения полей с данными, система просит
пользователя указать код, который он видит на картинке.
После проверки правильности ввода происходит решение - пускать
клиента в систему или нет.
Большой плюс такого метода - надежность. "Вскрыть" картинку и
найти в ней цифры не так-то просто, потому что здесь придется писать
сложный анализатор изображения.
Алгоритм работы
- генерируем случайное число с заданным количеством разрядов или
слово из словаря (будет использоваться как надпись на картинке) -
пароль
- создаем случайный код сессии
- во временном каталоге создаем файл с именем сессии, внутри
содержится сгенерированный пароль
- не забываем удалять старые файлы сессий, время жизни которых
истекло - неудачные попытки авторизации
- в заполняемой пользователем форме вставляем 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
Автор: Владимир Максименко
Источник: www.voldemar.info
|