Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Авторизация, борьба с подбором пароля 
:(
    Опции темы
Dima85
Дата 24.7.2009, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 19.7.2007

Репутация: нет
Всего: нет



Есть такой скрипт:
 
Код

#!/usr/bin/perl
use CGI qw(param);
use strict;
use CGI::Carp qw/fatalsToBrowser/;
use Fcntl ':flock';
use Digest::MD5 qw(md5_hex);

***

if (md5_hex($pass) eq 'bcf171c7da8b126152e63987f32c82d1') {
***
}


В последнее время замечаю иногда с разных IP пытаются подобрать пароль. 
Вопрос. Помогите пожалуйста усовершенствовать авторизацию. Допустим если 3 раза введен неправильно пароль, IP блокируется на 15-30 минут.

Собственно я знаю как это сделать с использованием базы данных, или простых файлов. Куда будут записываться количество попыток авторизации и собственно сам IP.
А есть ли возможность это сделать без использования БД или файлов? Поделитесь пожалуйста идеями.



PM MAIL   Вверх
Bulat
Дата 24.7.2009, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



Цитата(Dima85 @  24.7.2009,  17:25 Найти цитируемый пост)
А есть ли возможность это сделать без использования БД или файлов? Поделитесь пожалуйста идеями.


Чем сложнее программа - тем больше в ней ошибок.. По-моему все же лучше использовать БД и файлы, если нужно, создавая простые решения, но добиваясь тем самым большей надежности smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
arto
Дата 24.7.2009, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 1
Всего: 40



http -- stateless протокол, приделывайте костыли
PM MAIL ICQ   Вверх
Dima85
Дата 24.7.2009, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 19.7.2007

Репутация: нет
Всего: нет



А еще есть какие либо способы?

Может какой-то другой вид защиты, но что б это было зез поддержки баз данных и файлов.

Это сообщение отредактировал(а) Dima85 - 24.7.2009, 22:14
PM MAIL   Вверх
DaemonSuw
Дата 24.7.2009, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 11.3.2008

Репутация: нет
Всего: 3



http://ru.wikipedia.org/wiki/Captcha - используйте ее и не думайте машинном переборе...
Информацию о ip и вызовах вам надо все равно хранить где то, как реализовать счетчик, если не выгружать информацию в бд или файл? по моему никак! Не в куки же пользователю записывать  smile 
PM MAIL ICQ   Вверх
gcc
Дата 24.7.2009, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 2
Всего: 17



элементарно, логируй дествия, допустим за послдений 1 час

если не правильно ввели с 3 попыток и если больше определенного времени, то закрой доступ перебора пароля на некоторое время
PM WWW ICQ Skype GTalk Jabber   Вверх
Dima85
Дата 24.7.2009, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 19.7.2007

Репутация: нет
Всего: нет



Цитата(gcc @ 24.7.2009,  22:44)
элементарно, логируй дествия, допустим за послдений 1 час

если не правильно ввели с 3 попыток и если больше определенного времени, то закрой доступ перебора пароля на некоторое время

Как их логировать? Расскажите подробней.

Это сообщение отредактировал(а) Dima85 - 24.7.2009, 23:18
PM MAIL   Вверх
sir_nuf_nuf
Дата 25.7.2009, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 2
Всего: 31



Dima85, Да просто... У вас сильно нагруженная авторизация ? если нет - то я предлагаю начать с самого просто решения - DBM файлы.
Что то вроде того

Код

use Fcntl qw(:DEFAULT :flock);
use DB_File;

my $REMEMBER_ACCESS = 3;
my $EXPIRATION_SEC  = 3600;

sub check_ban {
  my $ip=shift;
  my $db = tie my %db, 'DB_File', "auth_ban.dbm", O_RDWR|O_CREAT|O_EXLOCK, 0600 or die "Can't initialize database: $!";
  
  my @usages = split ';', ($db{$ip} || '');   #load list of usages (in unix times) for current ip
  my $now = time();
  # if 3 or more access during last hour
  my $result = (scalar grep {$now - $_ < $EXPIRATION_SEC} @usages) >= $REMEMBER_ACCESS;
  # left no more than 2 rightest elements
  splice @usages, 0, (@usages - ($REMEMBER_ACCESS - 1)); 
  # add current time to list
  push @usages, $now;
  $db{$ip} = join ';', @usages;
 
  undef $db; untie %db;  #save
  return $result ? 1 : 0;
}


Переменные вы знаете зачем.
В случае неудачной аутентификации скармливаете этой функции ip, а она вам возвращает 1 - бан 0 - пока живет.

Тест: 100 000 уникальных ключей (айпишников) - размер базы ~ 6 метров.
В однопроцессном режиме (без конкуренции за базу) - 9000 проверок в секунду
В многопроцессном (8 процессов конкурируют за базу) - 10600 проверок в секунду.. 
(еще бы, упираемся в flock всего файла)

Вообще связка DB_File + flock хреново себя ведет под нагрузкой/при большой базе. В таком случае надежней BerkeleyDB база (нормальную) =)

Это сообщение отредактировал(а) sir_nuf_nuf - 25.7.2009, 03:56


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
shamber
Дата 25.7.2009, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: нет
Всего: 18



sir_nuf_nuf
smile он просил без файлов smile

PM MAIL Jabber   Вверх
sir_nuf_nuf
Дата 25.7.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 2
Всего: 31



вот блин  smile 


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Dima85
Дата 26.7.2009, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 19.7.2007

Репутация: нет
Всего: нет



sir_nuf_nuf, интересное решение, спасибо.
Но мне хочеться что-то без использования файлов или бд.
PM MAIL   Вверх
KSURi
Дата 26.7.2009, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 2
Всего: 27



И без использования компьютера)


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
sir_nuf_nuf
Дата 27.7.2009, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 2
Всего: 31



Dima85,  вы используете CGI или mod_perl ?


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
KSURi
Дата 27.7.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 2
Всего: 27



sir_nuf_nuf, если вы намекаете на то, что при использовании mod_perl можно хранить в памяти, то ведь это до первого рестарта. Не надежно получится.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
sir_nuf_nuf
Дата 27.7.2009, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 2
Всего: 31



KSURi,  так ведь это и не банилка. Это что бы слишком часто не ломились. Знаете, как в операционках - ошибся с вводом пароля - 5 сек подожди.. Так и здесь - пару раз ошибся - еще час твои попытки игнорятся. 

Проблема не в том.. проблема в том, что у всех чайлдов апача - своя память. А в случае с CGI - эта память еще и существует несколько секунд. Поэтому для хранения в памяти - нужно использовать shmem..  (которая кстати иногда реализуется через файлы отображаемые в память =))

Это сообщение отредактировал(а) sir_nuf_nuf - 27.7.2009, 12:12


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Dima85
Дата 6.9.2009, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 19.7.2007

Репутация: нет
Всего: нет



Сейчас пришла очередная идея. Если нельзя заблокировать IP то может можно хотя бы усложнить жизнь роботам подбирающим пароли.
Как вы смотрите на то если сделать задержку на авторизацию, если конечно возможно такое реализовать на perl.

Тоесть мы вводим пароль, если он неправильный join.pl выводит надпись вы заблокированы на 5,10 секунд и к нему неимеет доступ никто в течение этого времени (тоесть не может пройти авторизацию).

Дописывая это сообщение пришел в голову достаточно большой недостаток. Ведь если робот будет подбирать пароль и в это время я буду проходить авторизацию - у меня мало шансов т.к. мой join.pl постоянно будет в ожидание. Или я ошибаюсь? 
Хотя с другой стороны авторизацией пользуется только 3 человека как правело раз в неделю и вероятность того что именно в это время будет работать подборщик маловероятно.


P.S. С задержкой уже немного разобрался, но не понимаю почему такая реализация:
Код

if ($error eq 'ru') {print "<h2>Ошибка</h2><p>Попытка авторизации не удалась.</p>"; sleep(20); }

Почему скрипт засыпает на 20 секунд прежде чем вывести print. Print ведь стоит первым.

Так же все еще интересно услышать ваши мысли в целом об этом всем.



Это сообщение отредактировал(а) Dima85 - 6.9.2009, 23:53
PM MAIL   Вверх
TDrive
Дата 7.9.2009, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 6.9.2009

Репутация: нет
Всего: нет



Цитата(Dima85 @  6.9.2009,  23:38 Найти цитируемый пост)
Хотя с другой стороны авторизацией пользуется только 3 человека как правело раз в неделю и вероятность того что именно в это время будет работать подборщик маловероятно.


если у вас авторизация только для своих нескольких людей то можно кроме пароля хранить IP адреса этих людей и проверять при авторизации по IP адресам чужие или свои. если адреса динамические можно хранить адрес подсети например 189.189.*.* короче по ситуации смотря с каких IP брутфорсят.
а так самое надёжное и без файлов это грамотная капча.

PM MAIL   Вверх
shamber
Дата 7.9.2009, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: нет
Всего: 18



Цитата(Dima85 @  6.9.2009,  23:38 Найти цитируемый пост)
Почему скрипт засыпает на 20 секунд прежде чем вывести print.

а может буферизация?
PM MAIL Jabber   Вверх
Dima85
Дата 7.9.2009, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 19.7.2007

Репутация: нет
Всего: нет



TDrive, адреса постоянно меняються, сети так же.
shamber, расскажите пожалуйста подробней.


PM MAIL   Вверх
TDrive
Дата 7.9.2009, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 6.9.2009

Репутация: нет
Всего: нет



Цитата(Dima85 @  7.9.2009,  20:54 Найти цитируемый пост)
shamber, расскажите пожалуйста подробней.


функция print() в перле использует для вывода библиотеку iostream из С/С++ а там вывод сообщения происходит не сразу, а сначала собирается в буфер и выводится когда буфер полный или когда программа закончила работу как в вашем примере.
есть для вывода ещё функция syswrite() которая не использует буфер а выводит сразу 
например:
Код

if ($error eq 'ru') {syswrite(STDOUT,"<h2>Ошибка</h2><p>Попытка авторизации не удалась.</p>"); sleep(20);}

будет выведено сообщение а потом программа ждёт 20 сек

а если написать например
Код

print "bla bla bla";
my $error = 'ru';    
if ($error eq 'ru') {syswrite (STDOUT,"<h2>Ошибка</h2><p>Попытка авторизации не удалась.</p>"); sleep(20);}

то сначала будет напечатано "<h2>Ошибка</h2><p>Попытка авторизации не удалась.</p>" а через 20 сек "bla bla bla"

короче print() не выводит сообщение а записывает сообщение в буфер ввода/вывода а потом система читает из этого буфера.
есть ещё буферы в ОС, аппаратные буферы.




PM MAIL   Вверх
TDrive
Дата 7.9.2009, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 6.9.2009

Репутация: нет
Всего: нет



да есть ещё переменная $|
если $|=1 то буферизация выключается 
если $|=0 то буферизация включена
PM MAIL   Вверх
Dima85
Дата 8.9.2009, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 19.7.2007

Репутация: нет
Всего: нет



Пробовал 
Код

if ($error eq 'ru') {syswrite(STDOUT,"<h2>Ошибка</h2><p>Попытка авторизации не удалась.</p>"); sleep(20);}
 
Не работает. Возможно я что-то упустил? Скрипт ничего не выводит, ждет 20 секунд и вобщем-то все. Ошибок тоже нет.


Так же пробовал
Код

if ($error eq 'ru') {$|=1; print "<h2>Ошибка</h2><p>Попытка авторизации не удалась.</p>"; sleep(20); }

В этом случае сначала срабатывает sleep потом print.
PM MAIL   Вверх
TDrive
Дата 8.9.2009, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 6.9.2009

Репутация: нет
Всего: нет



у меня всё работает как и должно.

http://pic.ipicture.ru/uploads/090908/M7BVRXywWM.png

PM MAIL   Вверх
sir_nuf_nuf
Дата 8.9.2009, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 2
Всего: 31



Товарищи, вы какую-то странную идею обсуждаете - sleep(20) - усыпит процесс веб-сервера на 20 сек.
Это же готовая DOS атака. Даже напрягаться не придется - просто постоянные попытки авторизации в 30 потоков и сервера нет.

имхо это не вариант.


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
TDrive
Дата 8.9.2009, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 6.9.2009

Репутация: нет
Всего: нет



ИМХО самое простое пароли минимум 12 символов использовать из букв,цифр,спец знаков и пускай брутфорсят несколько лет.
PM MAIL   Вверх
Dima85
Дата 8.9.2009, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 19.7.2007

Репутация: нет
Всего: нет



sir_nuf_nuf, спасибо! Значит в топку эту идею.
TDrive, ну просто иногда не приятно, посматриваешь логи а там по 200-800 попуток подбора пароля с одного, двух IP и это за неделю.

Это сообщение отредактировал(а) Dima85 - 8.9.2009, 11:50
PM MAIL   Вверх
Dima85
Дата 12.9.2009, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 19.7.2007

Репутация: нет
Всего: нет



Цитата(sir_nuf_nuf @ 25.7.2009,  01:26)
Dima85, Да просто... У вас сильно нагруженная авторизация ? если нет - то я предлагаю начать с самого просто решения - DBM файлы.
Что то вроде того

Код

use Fcntl qw(:DEFAULT :flock);
use DB_File;

my $REMEMBER_ACCESS = 3;
my $EXPIRATION_SEC  = 3600;

sub check_ban {
  my $ip=shift;
  my $db = tie my %db, 'DB_File', "auth_ban.dbm", O_RDWR|O_CREAT|O_EXLOCK, 0600 or die "Can't initialize database: $!";
  
  my @usages = split ';', ($db{$ip} || '');   #load list of usages (in unix times) for current ip
  my $now = time();
  # if 3 or more access during last hour
  my $result = (scalar grep {$now - $_ < $EXPIRATION_SEC} @usages) >= $REMEMBER_ACCESS;
  # left no more than 2 rightest elements
  splice @usages, 0, (@usages - ($REMEMBER_ACCESS - 1)); 
  # add current time to list
  push @usages, $now;
  $db{$ip} = join ';', @usages;
 
  undef $db; untie %db;  #save
  return $result ? 1 : 0;
}


Переменные вы знаете зачем.
В случае неудачной аутентификации скармливаете этой функции ip, а она вам возвращает 1 - бан 0 - пока живет.

Тест: 100 000 уникальных ключей (айпишников) - размер базы ~ 6 метров.
В однопроцессном режиме (без конкуренции за базу) - 9000 проверок в секунду
В многопроцессном (8 процессов конкурируют за базу) - 10600 проверок в секунду.. 
(еще бы, упираемся в flock всего файла)

Вообще связка DB_File + flock хреново себя ведет под нагрузкой/при большой базе. В таком случае надежней BerkeleyDB база (нормальную) =)

Возможно у вас есть какие-то наброски того же но без use DB_File, мой сервер к сожаленью не поддерживает это. Был бы вам очень благодарен.
PM MAIL   Вверх
sir_nuf_nuf
Дата 12.9.2009, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 2
Всего: 31



Это как так ?
DB_File - идет в комплекте вместе с perl - должен быть.
Если только в Windows может не работать..


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.1141 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.