Ограничение попыток входа пользователя в систему в PHP

StackOverflow https://stackoverflow.com/questions/679756

Вопрос

Я видел веб-приложения с ограничениями на попытки входа пользователя в систему.

Является ли это необходимостью безопасности, и если да, то почему?

Например: у вас было три неудачные попытки входа в систему, давайте попробуем еще раз через 10 минут!!

Это было полезно?

Решение

Разъяснение Это дополнение к другим ответам.Использование хорошо реализованной captcha наряду с механизмом защиты от грубой силы, использующим сеансы, например.
Спрашивающий отметил это как принятое, предполагая, что капчи нечитаемы машинами (она почти правильно) и поэтому это получает отрицательные оценки, потому что люди думают, что это не полный ответ, и они правы.


Кроме того, использование хорошо реализованной CAPTCHA может быть альтернативным способом повысить безопасность вашего приложения от атак методом перебора.там есть широкий выбор поставщиков капчи доступно бесплатно, давайте попробуем простой способ, если вы спешите.Также, пожалуйста, учтите, что есть Люди убирайся отсюда , говоря это "о, нет!эта штука с капчей недостаточно безопасна, и иногда они правы!".

"Для тех из вас, кто не знает, КАПЧА - это программа, которая может определить, является ли ее пользователь человеком или другим компьютером.Это те маленькие изображения искаженного текста, которые вы переводите, когда регистрируетесь в Gmail или оставляете комментарий в чьем-то блоге.Их цель - убедиться, что кто-то не использует компьютер для автоматической регистрации миллионов онлайн-аккаунтов или ..." ссылка.

Другие советы

Однажды я увидел творческий подход к этому...

При каждой неудачной попытке входа в систему время блокировки увеличивается...экспоненциально.

attempt | lockout time
======================
   1    |     2s
   2    |     4s
   3    |     8s
   4    |    16s
   5    |    32s
   6    |    64s
   7    |   128s
   8    |   256s
   9    |   512s
  10    |  1024s

Теоретически, это позволяет пользователю совершить одну-две ошибки, но как только это становится попыткой "взлома", хакер блокируется на все более длительные периоды времени.

Я сам этим не пользовался (пока), но концептуально мне эта идея вполне нравится.Конечно, при успешном входе в систему счетчик сбрасывается.

Ограничение количества попыток, которые необходимо предпринять на веб-сайте, заключается в предотвращении грубых (автоматических) атак на ваш сайт.Если вы не ограничите эти попытки, хакер может настроить скрипт для продолжения подбора паролей до тех пор, пока не найдет один, и это может повлиять на доступность вашего веб-сервера.

Как правило, вы можете захотеть установить тайм-аут пользователя (10 минут, как вы упомянули) после 3 попыток и заблокировать его после 6 или 9 последовательных повторных попыток, вынудив пользователя связаться с вами, чтобы разблокировать свою учетную запись.Это сделано потому, что кто-то может изменить свои скрипты, чтобы настроить ваш тайм-аут.

Если пользователи смогут устанавливать свои собственные пароли, какой-нибудь бот / ребенок попытается войти в систему со списком распространенных паролей и добьется успеха.И если они не знают ни одного пользователя, они будут использовать такие распространенные имена, как admin, simon, rico и т.д.

Это не помогает просто пометить пользователя в сеансе, так как они могут просто удалить файл cookie или параметр запроса на своей стороне.Вам необходимо иметь количество неудачных попыток входа как для IP, так и для имени входа.Может быть, быть более снисходительным к IP, поскольку он может быть общим для многих пользователей.

Для своих собственных проектов я написал обобщенную библиотеку 'floodcontrol', которая обрабатывает подобные вещи.

Это позволяет мне указать, сколько попыток может быть предпринято за X промежуток времени.Это допускает определенное количество попыток "изящества" за короткое время, так что будет зафиксировано только действительно необычное поведение.

Я записываю в базу данных несколько вещей:

  • IP-адрес (или его первые 24 бита)
  • Действие, которое было предпринято (например, "войти в систему", "поиск", "комментарий")
  • Время попытки
  • Количество попыток (счетчик попыток)

Для каждой предпринятой попытки я запрашиваю частичный IP-адрес и действие, и если предыдущая попытка была предпринята в течение определенного промежутка времени, то я увеличиваю счетчик попыток для этой попытки.Если счетчик попыток превышает количество разрешенных попыток отсрочки, то я проверяю, была ли последняя попытка в течение X секунд с этого момента, и если да, возвращаю false - следовательно, действие будет заблокировано (и пользователю будет предложено подождать X секунд, прежде чем пытаться снова).Если счетчик попыток ниже количества повторных попыток, то я возвращаю значение true и оставляю его в покое.

Если человек с тем же IP-адресом зайдет позже, то количество предыдущих попыток не будет извлечено, потому что это было слишком давно.

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

Я считаю, что самым безопасным и простым способом было бы поместить счетчик "неудачных попыток" в базу данных.Таким образом, пользователь не сможет обойти его (отключив файлы cookie).Сброс при успешном входе в систему, конечно.

Сброс неудачных попыток после правильного входа в систему практически приводит всю систему в негодность.

Затем любой зарегистрированный пользователь может трижды угадать чужую учетную запись и пароль, затем войти в систему со своей собственной, чтобы сбросить счетчик, и повторить — это тоже можно автоматизировать.Таким образом, обычный зарегистрированный пользователь может, например, перебирать пароли администратора.

Сброс должен быть выполнен администратором, а не простым успешным входом в систему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top