Сейчас занимаюсь модулем пользователей в своей cms, конкретно дорабатываю авторизацию. Хотел спросить, как делается защита, когда к примеру после 3 неправильных попыток авторизоватся появляется капча для защиты от перебора. А конкретно как дать понять php что именно этому юзеру нужно капчу еще показать. Через сессии думаю не эффективно, так как можно закрыть браузер и открыть его снова и вводить логин/пасс без капчи, сессия же обнулится. Через БД вроде тоже не эффективно, если по IP там инфу хранить, это ж через прокси обходится. Подскажите схему как реализовать этот механизм?
Просто сразу заставлять вводить капчту (если ты про защиту от автоматического перебора) У меня реализовано, что после N неправильных попыток возможность авторизации для этого пользователя блокируется на 15 минут (900 секунд). Если IP продолжает долбиться, он уходит в банлист на 24 часа
Как Вариант: Делаем таблицу в которой храним кол-во попыток залогиниться. При 3+ неверных заходах делаем задержку перед следующей попыткой в, скажем, 20 секунд.
Нет, никаких задержек, только капча при 3+ неправильных попытках. Должно быть так же как это устроено на ucoz.ru Решил сделать такую таблицу: IP | Количество попыток | Время добавления в таблицу При первом неправильной логине заносится первая запись в таблицу. Когда количество попыток у IP достигает 3, помимо логина/пароля модуль авторизации начинает требовать ввод капчи. И таблицу эту очищать раз в день. Как вам такая схема? Или есть более оптимальный вариант?
По IP + по логину (например если идет подбор пароля для конкретного юзера через ботнет) + неплохо бы вообще смотреть плотность ошибок и если она превышает некое значение в единицу времени - показывать капчу всем. С этой точки зрения лучше делать просто инсерт на каждую ошибку и считать селектами. Чистить переодически по времени. По IP|логину на успешном логине... можно, но не обязательно.
Думаю по IP + логину не совсем хорошая идея, потому что можно перебирать один пароль и генерировать логины, так же как это делается в ICQ. Хотя на сайте обычно взламывают какого определенного юзера. Как думаете?
Я имел ввиду - при N ошибок с одного IP для последующих попыток с этого IP _или_ N ошибок для одного логина для последующих попыток с этим же логином (вне зависимости от IP)
А если просто сделать PHP: slepp(1); ? ;-) Для юзера лишняя секунда на авторизации и не заметна, а вот брутфорс уже не пройдет.
Этакая помощь брутфорсерам задосить ваш сайт? =) Можно, но капча лучше. Если сложно все это - считать и все такое - показывайте капчу всем =) Вот любителям кода решение на коленке без базы =) $file = stat('/tmp/pswd.lock'); if ($file[9]-time() <= 2) showcapcha(); --- if (wrong_password) touch('/tmp/pswd.lock');
Да не, не сложно)) Код мне не нужен, всё могу прекрасно реализовать сам, PHP программист со стажом 2 года, просто я искал максимально-удобный и эффективный способ именно с точки зрения теории. Скорее всего остановлюсь на варианте MiksIr