Возможно вы искали: 'Пуговки'

May 15 2025 18:36:15
  • Как сделать 8Gamers.Ru домашней страницей?
  • Игры
    • База данных по играх
    • Игровые новости
    • Игровая индустрия
    • Обзоры на игры
    • Прохождения игр
    • Гайды к играм
    • Превью о играх
    • Игровые тизеры
    • Игровые арты
    • Игровые обои
    • Игровые скриншоты
    • Игровые обложки
    • Игровые трейлеры
    • Игровое видео
    • Вышедшие игры
    • Ближайшие релизы игр
  • Кино и ТВ
    • База данных по кино
    • Статьи о кино
    • Постеры
    • Кадры из кино
    • Кино трейлеры
    • Сегодня в кино
    • Скоро в кино
  • Комиксы и манга
    • Манга по алфавиту
    • База данных по комиксах
    • Читать онлайн комиксы
    • Читать онлайн манга
    • База персонажей
  • Читы и коды
    • Чит-коды для PC игр
    • Чит-коды для консольных игр
    • Трейнеры
    • Коды Game Genie
  • Моддинг
    • Модификации
    • Карты к играм
    • Программы для моддинга
    • Статьи о моддинге
  • Геймдев
    • Всё о создании игр
    • Список движков
    • Утилиты в помощь игроделу
    • Конструкторы игр
    • Игровые движки
    • Библиотеки разработки
    • 3D-модели
    • Спрайты и тайлы
    • Музыка и звуки
    • Текстуры и фоны
  • Рецензии
    • Игры
    • Кино
    • Аниме
    • Комиксы
    • Мангу
    • Саундтреки
  • Саундтреки
    • Лирика
  • Файлы
    • Патчи к играм
    • Русификаторы к играм
    • Сохранения к играм
    • Субтитры к кино
  • Медиа
    • Видео
    • Фото
    • Аудио
    • Фан-арты
    • Косплей
    • Фото с виставок
    • Девушки из игр
    • Рисунки
    • Рисуем онлайн
    • Фотохостинг
  • Юмор
    • Анекдоты
    • Афоризмы
    • Истории
    • Стишки и эпиграммы
    • Тосты
    • Цитаты
  • Флеш
    • Азартные
    • Аркады
    • Бродилки
    • Гонки
    • Для девочек
    • Для мальчиков
    • Драки
    • Квесты
    • Леталки
    • Логические
    • Мультфильмы
    • Открытки
    • Приколы
    • Разное
    • Спорт
    • Стратегии
    • Стрелялки
Статистика

Статей: 87772
Просмотров: 96111483
Игры
Injustice:  Gods Among Us
Injustice: Gods Among Us
...
Dark Souls 2
Dark Souls 2
Dark Souls II - вторая часть самой хардкорной ролевой игры 2011-2012 года, с новым героем, сюжето...
Battlefield 4
Battlefield 4
Battlefield 4 - продолжение венценосного мультиплеер-ориентированного шутера от первого ли...
Кино
Steins;Gate
Steins;Gate
Любители японской анимации уже давно поняли ,что аниме сериалы могут дать порой гораздо больше пи...
Ку! Кин-дза-дза
Ку! Кин-дза-дза
Начинающий диджей Толик и всемирно известный виолончелист Владимир Чижов встречают на шумной моск...
Обзоры на игры
• Обзор Ibara [PCB/PS2] 18357
• Обзор The Walking ... 18801
• Обзор DMC: Devil M... 19879
• Обзор на игру Valk... 15877
• Обзор на игру Stars! 17764
• Обзор на Far Cry 3 17948
• Обзор на Resident ... 16024
• Обзор на Chivalry:... 17508
• Обзор на игру Kerb... 17981
• Обзор игры 007: Fr... 16619
Превью о играх
• Превью к игре Comp... 17960
• Превью о игре Mage... 14464
• Превью Incredible ... 14721
• Превью Firefall 13479
• Превью Dead Space 3 16334
• Превью о игре SimC... 14730
• Превью к игре Fuse 15442
• Превью Red Orche... 15542
• Превью Gothic 3 16343
• Превью Black & W... 17354
Главная » Статьи » Разное » Реализация теста Тьюринга на Perl (ввод цифр изображенных на картинке) (perl image auth web cgi)

Реализация теста Тьюринга на Perl (ввод цифр изображенных на картинке) (perl image auth web cgi)

Ключевые слова: perl, image, auth, web, cgi, (найти похожие документы)

From: Vladimir Maximenko <4raznoe@mail.ru>
Newsgroups: email
Date: Mon, 12 Jul 2004 18:21:07 +0000 (UTC)
Subject: Реализация теста Тьюринга на Perl (ввод цифр изображенных на картинке)


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


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

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

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

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

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


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

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

- создаем случайный код сессии

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

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

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

Владимир Максименко - веб-мастер http://www.price-list.kiev.ua
E-Mail: 4raznoe@mail.ru
http://WWW.VOLDEMAR.INFO
12.07.2004




# anti_robot_img.pm
# введи число, изображенное на картинке
# защита от заполнения формы с данными роботами
# Vladimir Maximenko 4raznoe@mail.ru

package anti_robot_img;

use Digest::MD5;
use Image::Magick;

require Exporter;
@ISA = qw( Exporter );
@EXPORT = qw(

anti_new_session
get_pass_str
get_pass_img
check_anti_robot
);

$flag_dir="/tmp";
$time_flag_live=60*60;

# генерация пароля
$kol_digit=5;
@pass_chars=(0..9);
#@pass_chars=("A".."Z", "a".."z", 0..9);

# возвращаемая картинка
$img_width=80;
$img_height=30;
$noise_pixels=100;

# строка случайных символов для картинки
sub get_pass_str
{
srand();
return join("", @pass_chars[map {rand @pass_chars}(1..$kol_digit)]);
}

# шифрованый код сессии
sub enctypt_session_code
{
my $salt=Digest::MD5->new;
# уникальная строка для шифрования
my $hash = $salt->add(time().$$);

# шифруем методом ASCII-HEX
return $hash->hexdigest;
}

# удаляем старые сессии
sub del_old_session
{
opendir (DIR, $flag_dir);
my @flag_files=readdir (DIR);
closedir (DIR);

shift(@flag_files);shift(@flag_files);
foreach $f (@flag_files)
{
if ($f =~ /.anti_robot$/)
{
my $mtime=(stat("$flag_dir/$f"))[9];
if ($mtime<time()-$time_flag_live) { unlink("$flag_dir/$f") || die "$!"; }
}
}
}

# проверяем, правильно ли введен проверочный код
sub check_anti_robot
{
my ($pass_str, $session_code)=@_;

# была такая сессиия ?
if (-e "$flag_dir/$session_code.anti_robot")
{
# правильный пароль ввели ?
$check_pass="";
open(FILE,"$flag_dir/$session_code.anti_robot") || die "$!";
while (<FILE>) { $check_pass.=$_; }
close(FILE);

if ($pass_str eq $check_pass) { return(1); }
else { return(0); }
}
else { return(0); }
}

# новая сессия, готовим ловушку для робота
sub anti_new_session
{
# новые случайные значения
my $new_pass_str=&get_pass_str();
my $new_session_code=&enctypt_session_code();

# удаляем старые сессии
&del_old_session();

# пишем в проверочный файл
open(FILE,">$flag_dir/$new_session_code.anti_robot") || die "$!";
print FILE $new_pass_str;
close(FILE);

return $new_pass_str, $new_session_code;
}

# выводим подготовленную картинку с паролем
sub get_pass_img
{
# из номера сессии достаем пароль
if ($_[0] and -e "$flag_dir/$_[0].anti_robot")
{
$pass_str="";
open(FILE,"$flag_dir/$_[0].anti_robot") || die "$!";
while (<FILE>) { $pass_str.=$_; }
close(FILE);
}
else { $pass_str=&get_pass_str(); }

# новая картинка
$image = Image::Magick->new;
$image->Set(size=>$img_width."x".$img_height);
$image->ReadImage('xc:white');

# выводим пароль с искажением текста
my $step_x=15;
my $base_x=5;
my $base_y=$img_height-5;
foreach my $letter (split(//, $pass_str))
{
# сдвиг и вращение буквы
my $sdvig_x=int(rand(4))-2;
my $sdvig_y=int(rand(10))-5;
my $rotate=int(rand(60))-30;

$image->Annotate(
antialias => 'true',
pointsize => 22,
x => $base_x+$sdvig_x,
y => $base_y+$sdvig_y,
rotate => $rotate,
fill => 'black',
encoding=> 'windows1251',
text => $letter
);

$base_x+=$step_x;
}

# добавляем шум (для затруднения восприятия)
for my $i (1..$noise_pixels)
{
my $rnd_x=int(rand($img_width));
my $rnd_y=int(rand($img_height));
$image->Set("pixel[$rnd_x,$rnd_y]"=>"red");
}

# выводим картинку
binmode STDOUT;
$image->Write('gif:-');
}

1;
474 Прочтений •  [Реализация теста Тьюринга на Perl (ввод цифр изображенных на картинке) (perl image auth web cgi)] [08.05.2012] [Комментариев: 0]
Добавил: Ukraine Vova
Ссылки
HTML: 
[BB Url]: 
Похожие статьи
Название Добавил Добавлено
• Реализация теста Тьюринга на Perl (... Ukraine Vova 08.05.2012
Ни одного комментария? Будешь первым :).
Пожалуйста, авторизуйтесь для добавления комментария.

Проект входит в сеть сайтов «8Gamers Network»

Все права сохранены. 8Gamers.NET © 2011 - 2025

Статьи
Рецензия на Pressure
Рецензия на Pressure
Чтобы обратить на себя внимание, начинающие маленькие разработчики, как правило, уходят в жанры, ...
Рецензия на Lost Chronicles of Zerzura
Рецензия на Lost Chron...
Игры, сделанные без любви и старания, похожи на воздушный шар – оболочка есть, а внутри пусто. Lo...
Рецензия на The Bridge
Рецензия на The Bridge
«Верх» и «низ» в The Bridge — понятия относительные. Прогуливаясь под аркой, можно запросто перей...
Рецензия на SimCity
Рецензия на SimCity
Когда месяц назад состоялся релиз SimCity, по Сети прокатилось цунами народного гнева – глупые ош...
Рецензия на Strategy & Tactics: World War 2
Рецензия на Strategy &...
Название Strategy & Tactics: World War II вряд ли кому-то знакомо. Зато одного взгляда на ее скри...
Рецензия на игру Scribblenauts Unlimited
Рецензия на игру Scrib...
По сложившейся традиции в информационной карточке игры мы приводим в пример несколько похожих игр...
Рецензия на игру Walking Dead: Survival Instinct, The
Рецензия на игру Walki...
Зомби и продукция-по-лицензии — которые и сами по себе не лучшие представители игровой биосферы —...
Обратная связь | RSS | Донейт | Статистика | Команда | Техническая поддержка