• Партнер

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

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

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

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

    • генерируем случайное число с заданным
      количеством разрядов или слово из
      словаря (будет использоваться как
      надпись на картинке) - пароль

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

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

    • в заполняемой пользователем форме
      вставляем 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

    Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии