В статье описан метод защиты от
автоматического заполнения и отправки
формы с сайта путем динамической генерации
картинки с кодом и подтверждения
правильности ввода.
Как это работает
Когда происходит заполнения полей с
данными, система просит пользователя
указать код, который он видит на картинке.
После проверки правильности ввода
происходит решение - пускать клиента в
систему или нет. Большой плюс такого метода
- надежность. "Вскрыть" картинку и
найти в ней цифры не так-то просто, потому
что здесь придется писать сложный
анализатор изображения.
Алгоритм работы
- генерируем случайное число с заданным
количеством разрядов или слово из
словаря (будет использоваться как
надпись на картинке) - пароль - создаем случайный код сессии
- во временном каталоге создаем файл с
именем сессии, внутри содержится
сгенерированный пароль - не забываем удалять старые файлы сессий,
время жизни которых истекло - неудачные
попытки авторизации - в заполняемой пользователем форме
вставляем 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. Уникальная строка для шифрования -
текущее время в raw-формате, а также процесс
скрипта.
$salt=Digest::MD5->new;
$hash = $salt->add(time().$$);
# шифруем методом ASCII-HEX
$session_code=$hash->hexdigest;
Подготовленная картинка с паролем
Картинка отображается на странице как STDOUT
работы небольшого скрипта, генерирующего
картинку, пароль передаем скрипту как
параметр:
<img align="right" src="https://xakep.ru/wp-content/uploads/post/23021//cgi-bin/anti_robot_img.cgi?code=<pass_str>" border=1 alt="">
Если параметр не задан - генерируется
картинка со случайным паролем. Для создания
и вывода картинки используется модуль Image::Magick.
Слово пароля посимвольно выводим на
изображение, каждая буква отображается со
случайным сдвигом по горизонтали и
вертикали, а также вращением. После этого
"зашумляем" изображение - сверху в
случайных местах разбрасываем
разноцветные точки. Можно еще добавить
вывод букв разными шрифтами и цветами, а
также использовать разноцветный фон (например
кусочки фотографий)
Исходники модуля можно взять по адресу:
http://voldemar.info/files/anti_robot_img.pm
Владимир Максименко - веб-мастер www.price-list.kiev.ua.
E-Mail: 4raznoe@mail.ru
WWW.VOLDEMAR.INFO