2010-07-04 5 views
4

J'essaie de bloquer la connexion pendant x minutes après y avoir échoué. Je prévois déjà d'enregistrer les connexions des utilisateurs, donc je suppose que je pourrais utiliser la même base de données pour calculer si le blocage doit se produire.blocage de la connexion après X tentatives infructueuses

Mes questions:

  • est-il logique d'utiliser la même table de journaux pour exécuter la logique du y ont échoué les tentatives de blocage?
  • Certaines personnes ont une table juste pour les tentatives échouées, et j'ai entendu dire qu'elles incrémenter juste le nombre de connexions échouées. Cela n'a pas de sens puisque tout ce qu'ils stockent est le nombre de tentatives échouées, et non dans quel délai. 3 tentatives échouées en 10 minutes ne sont pas les mêmes que 3 échecs en 3 jours. Est-ce que le laps de temps importe? Vous bloquez-vous après l'échec de tentatives, de périodes ou de tentatives infructueuses dans un intervalle de temps? Et quel est le meilleur délai pour cela? Est-ce que quelqu'un peut clarifier l'approche de la meilleure pratique pour cela?
+0

J'ai trouvé sympa de doubler le délai entre les tentatives, donc les premières tentatives sont rapides, mais au bout d'un moment, cela devient ridiculement long, mais Marko a de bonnes suggestions. –

+0

Si nous avons répondu correctement à votre question, veuillez accepter cette réponse. Cheers :) – Marko

Répondre

7

Vous avez besoin de ce qu'on appelle une fenêtre de tentative de mot de passe.

Fondamentalement 2 champs dans la base de données, un LastPasswordAttempt (datetime) et PasswordAttemptCount (int)

Puis sur chaque connexion, vérifiez quand la dernière LastPasswordAttempt est survenue et si elle a été le dernier mot 10 minutes - incrémenter le PasswordAttemptCount, sinon réinitialisez-le à 0 (ou 1 car ils viennent d'échouer).

Dans la même logique, vérifiez si PasswordAttemptCount est égal à 5 ​​ou plus, si c'est le cas - refusez l'accès utilisateur. Vous pourriez avoir un troisième champ qui les verrouille pendant quelques heures ou un jour.

c.-à-d. CanLoginAfter (datetime) que vous pouvez définir sur une journée à partir de la dernière tentative de mot de passe.

Hope this helps

+7

Méfiez-vous de la façon dont vous allez à ce sujet.Si vous avez un site public, avec l'interaction de l'utilisateur, cela peut être utilisé pour bloquer de manière malveillante les gens de leur propre compte par d'autres personnes. Par conséquent, soit donner à l'utilisateur légitime un moyen de supprimer le verrouillage - e-mail ou autre ou utiliser des temps plus courts. Sinon, vous aurez parfois des utilisateurs agacés. –

+1

Je suis d'accord @MrXexxed - bien sûr, ils devraient deviner le nom d'utilisateur. – Marko

+0

@Marjo Ivanovski en effet ils le feraient. Lorsqu'un site utilise un email ou un nom d'écran séparé pour un nom d'utilisateur qui serait plus difficile, mais il y a toujours des sites où le nom d'utilisateur est le pseudonyme et dans ce cas un site où ils publient des commentaires contre eux. Sinon, c'est moins un problème de toute façon. –

1

Une approche serait de le faire:

  • user_lockout: user_id, expires_dt (pourrait faire partie de la table d'utilisateur régulier)
  • failed_login_log: user_id, dt (pourrait faire partie d'une autre table de journal)

Lors de toute tentative de connexion pour user_id, vérifiez que expires_dt est dans le passé ou NULL. (Si ultérieurement, le compte est verrouillé.)

En cas d'échec de connexion, insérez un enregistrement dans failed_login_log, puis comptez le nombre d'échecs de connexion au cours des X dernières minutes (WHERE dt > DATE_SUB(NOW(), INTERVAL x MINUTES)). Si ce nombre est supérieur à Y, mettez à jour user_lockout.expires_dt à NOW() + Z MINUTES.

Ceci vous permet de verrouiller un compte pendant Z minutes après que Y ait échoué dans X minutes.

Questions connexes