2010-07-04 4 views
4

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

Мои вопросы:

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

Мне было приятно просто удвоить время задержки между попытками, поэтому первые несколько попыток быстрые, но через некоторое время это становится смехотворно длинным, но у Марко хорошие предложения. –

+0

Если мы правильно ответили на ваш вопрос, примите этот ответ. Cheers :) – Marko

ответ

7

Вам понадобится окно с паролем.

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

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

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

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

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

+7

Будьте осторожны, как вы это делаете.Если у вас есть общедоступный сайт, с пользовательским взаимодействием, это может быть использовано для злонамеренного блокирования людей из собственного аккаунта другими людьми. Поэтому либо дайте законному пользователю какой-либо способ удалить блокировку - электронную почту или что-то еще, или использовать более короткое время. Кроме того, иногда вы будете раздражать пользователей. – 2010-07-04 23:31:16

+1

Я согласен с @MrXexxed - конечно, им придется угадать имя пользователя. – Marko

+0

@ Марджо Ивановски, они бы это сделали. Если сайт использует электронную почту или отдельное имя экрана для имени пользователя, которое было бы более жестким, но все еще есть сайты, где имя пользователя - это имя экрана, и в этом случае, если это сайт, на котором они публикуют комментарии, сообщения или что-либо публично, он может быть использован против них. Если это не так, то все равно. – 2010-07-04 23:35:33

1

Один подход должен был бы сделать это:

  • 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 минут.

Смежные вопросы