Question

J'aimerais pouvoir parcourir les tentatives de connexion en fonction des tentatives infructueuses, mais j'ai eu quelques questions.

Dois-je utiliser MySQL? (Lisez qu'il pourrait essuyer la base de données)
Dois-je parcourir par l'utilisateur et à l'échelle du système ou simplement à l'échelle du système? (pour donc empêcher les gens normaux de deviner les mots de passe)
Comment dois-je calculer mon seuil? (il s'adapte donc automatiquement aux changements / croissance)
Comment dois-je récupérer ce seuil? Requête / calculer sur chaque échec ou magasin sur cache?
Que dois-je utiliser pour m'entraîner? (Lire une réponse que Sleep () pourrait finir par tendre le serveur)

Quelqu'un a-t-il un exemple de code?

Je suis assez nouveau dans ce domaine donc j'apprécie l'aide! Merci

Était-ce utile?

La solution

J'ai implémenté un Mécanisme de limitation des pauvres dans phonction En utilisant APC seul, c'est ainsi que je l'utilise:

// allow 60 requests every 30 seconds
// each request counts as 1 (expensive operations can use higher values)
// keep track of IPs by REMOTE_ADDR (ignore others)

$throttle = ph()->Throttle($ttl = 30, $exit = 60, $count = 1, $proxy = false);

if ($throttle === true)
{
    // IP exceded 30 requests in the last 60 seconds, die() here
}

else
{
    // $throttle is a float
    // number of requests in the last 30 seconds / 30 seconds

    /*
     1 req / 30 = 0,033 sec
     5 req / 30 = 0,166 sec
    10 req / 30 = 0,333 sec
    15 req / 30 = 0,5   sec
    20 req / 30 = 0,666 sec
    25 req / 30 = 0,833 sec
    30 req / 30 = 1     sec
    */

    usleep(intval(floatval($throttle) * 1000000));
}

Je l'utilise sur mon contrôleur de front et je passe la valeur à ma méthode de routage, mais c'est une autre histoire.

L'essentiel est que si vous utilisez APC, vous pouvez garder les choses très rapides en mémoire et avec peu de consommation de mémoire car APC suit une méthodologie Filo. Si vous avez besoin de délais d'attente bien plus élevés, vous pouvez envisager d'utiliser quelque chose qui n'est pas basé sur la mémoire.

BTW: MySQL prend en charge les tables avec le moteur de mémoire.


Le problème avec sleep():

Un serveur Web Apache typique avec PHP installé comme module mangera environ 10 Mo de RAM par instance, pour éviter de dépasser votre RAM disponible, il existe des paramètres Apache que vous pouvez configurer pour limiter le nombre maximal d'instances qu'Apache est capable de démarrer.

Le problème est quand vous sleep(), cette instance est toujours active et avec suffisamment de demandes pourrait finir par manger toutes les créneaux disponibles pour démarrer de nouveaux serveurs, ce qui rend votre site Web inaccessible jusqu'à ce que certaines demandes en attente soient remplies.

Il n'y a aucun moyen de surmonter cela de PHP Afaik, donc à la fin, c'est à vous.


Le principe est le même pour la limitation du système:

function systemWide($ttl = 86400, $exit = 360)
{
    if (extension_loaded('apc') === true)
    {
        $key = array(__FUNCTION__);

        if (apc_exists(__FUNCTION__) !== true)
        {
            apc_store(__FUNCTION__, 0, $ttl);
        }

        $result = apc_inc(__FUNCTION__, 1);

        if ($result < $exit)
        {
            return ($result / $ttl);
        }

        return true;
    }

    return false;
}

Autres conseils

Le journal a échoué des tentatives de connexion dans un tableau comme ceci:

FailedLogins
id
timestamp
ip

Chaque fois qu'un utilisateur essaie de vous connecter, vous vérifiez si l'adresse IP de l'utilisateur a x nombre de tentatives de connexion ratées au cours des dernières secondes.

Si l'utilisateur a échoué x des temps en y secondes, vous présentez un message d'erreur ou un captcha.

Une base de données MySQL est capable de gérer des tons de demandes / SEC, vous n'avez donc pas à vous soucier des cous de bouteille si vous n'avez pas de milliers d'utilisateurs.

Vous pouvez également utiliser Sleep () Remarque: PHP gère plus d'utilisateurs que ASP.NET - alors encore une fois. Si vous n'avez pas de milliers d'utilisateurs, vous pouvez utiliser des méthodes de sommeil, sans col bouteille.

La façon dont je le fais normalement, c'est de stocker les tentatives de connexion (IP, UserID et horodatage). Conservez-le dans une table et réinitialisez la table lorsque vous en avez envie (à une certaine taille ou heure de la journée). Si un utilisateur + ip a plus que "des tentatives de connexion" dans un "certain temps", redirigez l'utilisateur vers une page qui indique à l'utilisateur qu'il a utilisé pour de nombreuses tentatives et ne pourra pas se connecter les 15 minutes suivantes (ou tout ce que vous ressentez). Un peu "fenêtres" comme je suppose, mais ça marche comme un charme :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top