3 votes

Limiter les tentatives de connexion quel que soit l'utilisateur ?

J'ai un système de connexion nécessitant un nom d'utilisateur et un mot de passe. Je veux afficher un captcha après un certain nombre de tentatives de connexion infructueuses. Quelle est la bonne façon d'implémenter cela ? J'ai lu un peu partout sur ce site et certaines solutions suggèrent d'ajouter un "failed-attempts-count" à la table des utilisateurs. Cependant, j'ai besoin que les tentatives échouées ne soient pas liées à un certain utilisateur - c'est-à-dire que je voudrais que le captcha soit affiché indépendamment du fait que le nom d'utilisateur qui a été entré existe ou non dans le système. Le stockage dans une variable de session serait-il acceptable (j'utilise PHP) ? Si c'est le cas, n'y a-t-il pas d'inconvénient à jeter les données dans les variables de session selon les besoins ? J'ai déjà un identifiant de session pour chaque visiteur du site (qu'il soit connecté ou non) et je pourrais donc créer une table qui associe les tentatives de connexion à cet identifiant de session...une idée de la meilleure approche / la plus sûre ? Merci.

Mise à jour : D'après les réponses obtenues jusqu'à présent, il semble que l'ID de session ne soit pas la meilleure idée, car le pirate pourrait simplement vider son cache (mais est-ce vraiment un problème, car cela ne ralentirait-il pas suffisamment l'attaque par force brute pour la rendre inutile ?) L'autre option est par IP... mais j'hésite pour les utilisateurs sous un intranet ou un proxy car les tentatives échouées seront partagées.... Je ne peux pas vraiment penser à d'autres méthodes... et vous ?

6voto

Andre Miller Points 6713

Le danger d'utiliser un ID de session est que quelqu'un qui écrit une attaque par force brute peut simplement effacer ses cookies à chaque tentative et ainsi lui donner une nouvelle session.

N'oubliez pas qu'une attaque automatisée par force brute peut être écrite dans un langage de script en dehors d'un navigateur et qu'elle pourrait manipuler les cookies envoyés pour chaque demande.

Une autre façon de procéder serait de créer un tableau avec les IP sources des utilisateurs et d'y ajouter le compteur. Cependant, cela gênera les utilisateurs qui utilisent un serveur proxy. Mais au moins vous attraperez ceux qui essaient de deviner les mots de passe à plusieurs reprises à partir du même endroit.

MISE À JOUR : Le fait de devoir effacer les cookies lors de tentatives successives de force brute ne ralentirait pas l'attaque, car ce processus serait automatisé et se produirait presque instantanément. La manipulation des cookies dans ce type d'attaques est assez courante. Modifier un cookie n'est pas la même chose que vider le cache de votre navigateur (ce qui prend généralement un certain temps car il faut supprimer un tas de fichiers). Il suffit à l'attaquant d'empêcher l'envoi d'un cookie.

2voto

Jason Points 1478

Installer APC http://www.php.net/apc ou memcache(d) http://www.php.net/memcache ou ici http://www.php.net/memcached (memcache nécessite également l'installation d'un serveur memcached, voir ici http://www.danga.com/memcached/ ), puis utilisez les commandes d'incrémentation appropriées pour les mauvaises tentatives de connexion à partir d'une adresse IP avec un délai d'attente qui vous convient (5 minutes, 30 minutes, etc...). Cela vous permettra de déterminer RAPIDEMENT si une tentative de force brute est en cours (sans vous soucier des conditions de course) et d'expirer automatiquement le bloc après un laps de temps déterminé.

Exemple d'APC :

$max_attempts = 5;  // max attempts before captcha
$attempts = apc_fetch('login_attempts_'.$ip));
if($attempts and $attempts>$max_attempts){
    // block code here or redirect, captcha etc... also suggest a short sleep time to delay answer, slow down bot
}else{
    // check login here, run next code if login fails
    if($login_failed){
        if(!$attempts){
            apc_store('login_attempts_'.$ip,1,$timeout);
        }else{
            // function NOT currently documented on php.net, increments number stored in key
            apc_inc('login_attempts_'.$ip);
        }
    }
}

Bien sûr, il s'agit d'un exemple très approximatif... mais vous avez compris l'idée.

1voto

Blindy Points 26706

L'approche par session ne fonctionnera pas si le pirate ferme son navigateur et le rouvre à chaque tentative, donc un tableau stockant le nombre de tentatives échouées et l'heure de la dernière tentative (pour pouvoir vérifier si une heure s'est écoulée et remettre le compteur à zéro) par utilisateur serait le moyen le plus sûr.

1voto

Moak Points 4068

Vous pouvez enregistrer toutes les tentatives échouées avec une IP et une heure. Les anciennes tentatives échouées sont supprimées après un certain temps, et s'il y a plus d'un certain nombre de tentatives échouées pour une IP donnée, le captcha est affiché.

0voto

Hans Points 539

L'information la plus précise que vous pouvez obtenir est leur adresse IP. N'utilisez pas de cookies de session si vous voulez que l'information soit précise, car l'utilisateur peut simplement ignorer votre cookie de session (par exemple, en utilisant curl). Mais si vous êtes préoccupé par les adresses IP partagées, vous pouvez essayer d'inclure des informations supplémentaires, comme l'agent du navigateur ou utiliser ajax pour renvoyer d'autres informations que vous ne pouvez pas obtenir autrement. Mais tout ce qui n'est pas l'adresse IP peut être falsifié (même dans ce cas, vous pouvez utiliser des proxies).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X