блокировка входа после X неудачных попыток - PullRequest
4 голосов
/ 05 июля 2010

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

Мои вопросы:

  • имеет ли смысл использовать ту же таблицу журналов для запуска логики блокировки неудачных попыток?
  • У некоторых людей есть таблица только для неудачных попыток, и я слышал, что они просто увеличивают число неудачных входов в систему. Это не имеет смысла, поскольку все, что они хранят, это количество неудачных попыток, а не за какой период времени. 3 неудачные попытки за 10 минут - это не то же самое, что 3 неудачные попытки за 3 дня. Имеет ли значение временной интервал? Блокируете ли вы после x неудачных попыток, периода или x неудачных попыток за интервал времени y. И каковы наилучшие временные рамки для этого?
  • Может кто-нибудь прояснить лучший подход к этому вопросу?

Ответы [ 2 ]

7 голосов
/ 05 июля 2010

Вам нужно то, что называется окном попытки пароля.

В основном 2 поля в базе данных, одно LastPasswordAttempt (datetime) и PasswordAttemptCount (int)

Затем при каждом входе в систему проверяйте, когда произошла последняя LastPasswordAttempt, и если это было в последние, скажем, 10 минут, - увеличьте значение PasswordAttemptCount, в противном случае установите для него значение 0 (или 1, поскольку они только что завершились неудачей).

В той же логике проверьте, равно ли PasswordAttemptCount, скажем, 5 или более, если это так, - запретите доступ пользователя. Вы можете иметь 3-е поле, которое блокирует их на несколько часов или день.

т.е. CanLoginAfter (datetime), который вы можете установить на день с момента последней попытки ввода пароля.

Надеюсь, это поможет

1 голос
/ 05 июля 2010

Один из подходов заключается в следующем:

  • user_lockout: user_id, expires_dt (может быть частью таблицы обычного пользователя)
  • failed_login_log: user_id, dt (может быть частью другой таблицы журнала)

При любой попытке входа в систему для user_id, убедитесь, что expires_dt в прошлом или имеет значение NULL.(Если в будущем учетная запись заблокирована.)

При неудачном входе в систему вставьте запись в failed_login_log, а затем подсчитайте количество неудачных входов в систему за последние X минут (WHERE dt > DATE_SUB(NOW(), INTERVAL x MINUTES)).

Если это число больше Y, обновите user_lockout.expires_dt до NOW() + Z MINUTES.

Это позволяет заблокировать учетную запись на Z минут после неудачных попыток Y в течение X минут.

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