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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Авторизация, борьба с подбором пароля 
:(
    Опции темы
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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


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

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


 




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


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

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