| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: разработка для Web > Авторизация, борьба с подбором пароля |
| Автор: Dima85 24.7.2009, 17:25 | ||
Есть такой скрипт:
В последнее время замечаю иногда с разных IP пытаются подобрать пароль. Вопрос. Помогите пожалуйста усовершенствовать авторизацию. Допустим если 3 раза введен неправильно пароль, IP блокируется на 15-30 минут. Собственно я знаю как это сделать с использованием базы данных, или простых файлов. Куда будут записываться количество попыток авторизации и собственно сам IP. А есть ли возможность это сделать без использования БД или файлов? Поделитесь пожалуйста идеями. |
| Автор: arto 24.7.2009, 18:59 |
| http -- stateless протокол, приделывайте костыли |
| Автор: Dima85 24.7.2009, 22:13 |
| А еще есть какие либо способы? Может какой-то другой вид защиты, но что б это было зез поддержки баз данных и файлов. |
| Автор: DaemonSuw 24.7.2009, 22:25 |
| http://ru.wikipedia.org/wiki/Captcha - используйте ее и не думайте машинном переборе... Информацию о ip и вызовах вам надо все равно хранить где то, как реализовать счетчик, если не выгружать информацию в бд или файл? по моему никак! Не в куки же пользователю записывать |
| Автор: gcc 24.7.2009, 22:44 |
| элементарно, логируй дествия, допустим за послдений 1 час если не правильно ввели с 3 попыток и если больше определенного времени, то закрой доступ перебора пароля на некоторое время |
| Автор: Dima85 24.7.2009, 23:17 | ||
Как их логировать? Расскажите подробней. |
| Автор: sir_nuf_nuf 25.7.2009, 01:26 | ||
| Dima85, Да просто... У вас сильно нагруженная авторизация ? если нет - то я предлагаю начать с самого просто решения - DBM файлы. Что то вроде того
Переменные вы знаете зачем. В случае неудачной аутентификации скармливаете этой функции ip, а она вам возвращает 1 - бан 0 - пока живет. Тест: 100 000 уникальных ключей (айпишников) - размер базы ~ 6 метров. В однопроцессном режиме (без конкуренции за базу) - 9000 проверок в секунду В многопроцессном (8 процессов конкурируют за базу) - 10600 проверок в секунду.. (еще бы, упираемся в flock всего файла) Вообще связка DB_File + flock хреново себя ведет под нагрузкой/при большой базе. В таком случае надежней BerkeleyDB база (нормальную) =) |
| Автор: shamber 25.7.2009, 11:59 |
| sir_nuf_nuf, |
| Автор: sir_nuf_nuf 25.7.2009, 13:38 |
| вот блин |
| Автор: Dima85 26.7.2009, 18:09 |
| sir_nuf_nuf, интересное решение, спасибо. Но мне хочеться что-то без использования файлов или бд. |
| Автор: KSURi 26.7.2009, 19:02 |
| И без использования компьютера) |
| Автор: sir_nuf_nuf 27.7.2009, 08:56 |
| Dima85, вы используете CGI или mod_perl ? |
| Автор: KSURi 27.7.2009, 11:45 |
| sir_nuf_nuf, если вы намекаете на то, что при использовании mod_perl можно хранить в памяти, то ведь это до первого рестарта. Не надежно получится. |
| Автор: sir_nuf_nuf 27.7.2009, 12:12 |
| KSURi, так ведь это и не банилка. Это что бы слишком часто не ломились. Знаете, как в операционках - ошибся с вводом пароля - 5 сек подожди.. Так и здесь - пару раз ошибся - еще час твои попытки игнорятся. Проблема не в том.. проблема в том, что у всех чайлдов апача - своя память. А в случае с CGI - эта память еще и существует несколько секунд. Поэтому для хранения в памяти - нужно использовать shmem.. (которая кстати иногда реализуется через файлы отображаемые в память =)) |
| Автор: Dima85 6.9.2009, 23:38 | ||
| Сейчас пришла очередная идея. Если нельзя заблокировать IP то может можно хотя бы усложнить жизнь роботам подбирающим пароли. Как вы смотрите на то если сделать задержку на авторизацию, если конечно возможно такое реализовать на perl. Тоесть мы вводим пароль, если он неправильный join.pl выводит надпись вы заблокированы на 5,10 секунд и к нему неимеет доступ никто в течение этого времени (тоесть не может пройти авторизацию). Дописывая это сообщение пришел в голову достаточно большой недостаток. Ведь если робот будет подбирать пароль и в это время я буду проходить авторизацию - у меня мало шансов т.к. мой join.pl постоянно будет в ожидание. Или я ошибаюсь? Хотя с другой стороны авторизацией пользуется только 3 человека как правело раз в неделю и вероятность того что именно в это время будет работать подборщик маловероятно. P.S. С задержкой уже немного разобрался, но не понимаю почему такая реализация:
Почему скрипт засыпает на 20 секунд прежде чем вывести print. Print ведь стоит первым. Так же все еще интересно услышать ваши мысли в целом об этом всем. |
| Автор: TDrive 7.9.2009, 01:39 | ||
если у вас авторизация только для своих нескольких людей то можно кроме пароля хранить IP адреса этих людей и проверять при авторизации по IP адресам чужие или свои. если адреса динамические можно хранить адрес подсети например 189.189.*.* короче по ситуации смотря с каких IP брутфорсят. а так самое надёжное и без файлов это грамотная капча. |
| Автор: shamber 7.9.2009, 19:23 |
а может буферизация? |
| Автор: Dima85 7.9.2009, 20:54 |
| TDrive, адреса постоянно меняються, сети так же. shamber, расскажите пожалуйста подробней. |
| Автор: TDrive 7.9.2009, 23:07 | ||||
функция print() в перле использует для вывода библиотеку iostream из С/С++ а там вывод сообщения происходит не сразу, а сначала собирается в буфер и выводится когда буфер полный или когда программа закончила работу как в вашем примере. есть для вывода ещё функция syswrite() которая не использует буфер а выводит сразу например:
будет выведено сообщение а потом программа ждёт 20 сек а если написать например
то сначала будет напечатано "<h2>Ошибка</h2><p>Попытка авторизации не удалась.</p>" а через 20 сек "bla bla bla" короче print() не выводит сообщение а записывает сообщение в буфер ввода/вывода а потом система читает из этого буфера. есть ещё буферы в ОС, аппаратные буферы. |
| Автор: TDrive 7.9.2009, 23:22 |
| да есть ещё переменная $| если $|=1 то буферизация выключается если $|=0 то буферизация включена |
| Автор: Dima85 8.9.2009, 08:37 | ||||
Пробовал
Не работает. Возможно я что-то упустил? Скрипт ничего не выводит, ждет 20 секунд и вобщем-то все. Ошибок тоже нет. Так же пробовал
В этом случае сначала срабатывает sleep потом print. |
| Автор: TDrive 8.9.2009, 09:11 |
| у меня всё работает как и должно. http://pic.ipicture.ru/uploads/090908/M7BVRXywWM.png |
| Автор: sir_nuf_nuf 8.9.2009, 09:21 |
| Товарищи, вы какую-то странную идею обсуждаете - sleep(20) - усыпит процесс веб-сервера на 20 сек. Это же готовая DOS атака. Даже напрягаться не придется - просто постоянные попытки авторизации в 30 потоков и сервера нет. имхо это не вариант. |
| Автор: TDrive 8.9.2009, 10:56 |
| ИМХО самое простое пароли минимум 12 символов использовать из букв,цифр,спец знаков и пускай брутфорсят несколько лет. |
| Автор: Dima85 8.9.2009, 11:48 |
| sir_nuf_nuf, спасибо! Значит в топку эту идею. TDrive, ну просто иногда не приятно, посматриваешь логи а там по 200-800 попуток подбора пароля с одного, двух IP и это за неделю. |
| Автор: Dima85 12.9.2009, 19:34 | ||||
Возможно у вас есть какие-то наброски того же но без use DB_File, мой сервер к сожаленью не поддерживает это. Был бы вам очень благодарен. |
| Автор: sir_nuf_nuf 12.9.2009, 22:23 |
| Это как так ? DB_File - идет в комплекте вместе с perl - должен быть. Если только в Windows может не работать.. |