Question

Quel est le meilleur moyen d'empêcher les robots, les utilisateurs malveillants, etc. d'exécuter les scripts php trop rapidement? Est-ce que ça va si j'utilise les fonctions usleep() ou sleep() pour faire simplement & "Rien &"; pendant un moment (juste avant que le code souhaité s’exécute), ou est-ce tout simplement stupide et existe-t-il de meilleurs moyens pour cela?

Exemple:

function login() {
 //enter login code here
}

function logout() {
 //enter logout code here
}

Si je mets simplement, disons, usleep(3000000) avant les codes de connexion et de déconnexion, est-ce que ça va, ou y a-t-il de meilleures façons plus sages d'atteindre ce que je veux réaliser?

modifier: Selon les suggestions ci-dessous, usleep ou sleep provoque uniquement le désengagement du processeur du script en cours d'exécution par l'utilisateur actuel, ou le fait-il désengager de l'ensemble du service? Si un utilisateur + script invoque un <=> / <=>, tous les utilisateurs + scripts simultanés seront-ils également retardés?

Était-ce utile?

La solution

La plupart des serveurs Web (Apache par exemple) fonctionnent de manière à conserver une collection de threads de travail. Lorsqu'un script PHP est exécuté, un thread exécute le script PHP.

Lorsque votre script effectue sleep(100) son exécution, elle prend 100 secondes .. Cela signifie que votre thread de travail est bloqué pendant 100 secondes.

Le problème est que vous avez un nombre très limité de threads de travail - disons que vous avez 10 threads et que 10 personnes se connectent - votre serveur Web ne peut plus répondre à d'autres questions.

Le meilleur moyen de limiter le nombre de connexions (ou d’autres actions) consiste à utiliser un type de stockage rapide en mémoire ( memcached est parfait pour cela), mais cela nécessite l'exécution d'un processus séparé et est assez compliqué (vous pouvez le faire si vous utilisez quelque chose comme Facebook ..).

Plus simplement, vous pourriez avoir une table de base de données contenant user_id ou ip_address, first_failed et failure_counter.

Chaque fois que vous obtiendrez un échec de connexion, vous (en pseudo-code) ferait ce qui suit:

if (first_failed in last hour) and (failure_counter > threshold):
    return error_403("Too many authentication failures, please wait")
elseif first_failed in last hour:
    increment failure_counter
else:
    reset first_failed to current time
    increment failure_counter

Peut-être pas la plus efficace, et il y a de meilleures façons, mais cela devrait plutôt cesser brutalement. L'utilisation de memcached est fondamentalement la même, mais la base de données est remplacée par memcached (ce qui est plus rapide)

Autres conseils

  

pour arrêter les robots, les utilisateurs malveillants, etc.   d'exécuter des scripts php trop rapidement?

Je voudrais d’abord vous demander ce que vous essayez vraiment d’empêcher? S'il s'agit d'attaques par déni de service, je dois dire que vous ne pouvez rien faire si vous êtes limité par ce que vous pouvez ajouter aux scripts PHP. L’état de la technique va bien au-delà de ce que nous pouvons protéger contre les programmeurs. Commencez à regarder les outils administrateur système conçus à cet effet.

Ou essayez-vous de limiter votre service afin que de vraies personnes puissent y accéder mais que les bots ne le puissent pas? Si oui, je regarderais quelques & Quot; captcha & Quot; techniques.

Ou essayez-vous d'empêcher les utilisateurs d'interroger votre site toutes les secondes à la recherche de nouveau contenu? Si tel est le cas, je voudrais envisager de leur fournir un flux RSS ou un autre moyen de les notifier afin qu'ils ne consomment pas votre bande passante.

Ou est-ce autre chose?

En général, je dirais que ni dormir () ni usleep () n'est un bon moyen.

Votre méthode suggérée forcera TOUS les utilisateurs à attendre inutilement avant de se connecter.

La plupart des serveurs LAMP (et la plupart des routeurs / commutateurs) sont déjà configurés pour empêcher les attaques par déni de service. Pour ce faire, ils refusent plusieurs demandes consécutives à partir de la même adresse IP.

Vous ne voulez pas dormir dans votre php. Cela réduira considérablement le nombre de demandes simultanées que votre serveur peut gérer, car vos connexions seront maintenues en attente.

La plupart des serveurs HTTP possèdent des fonctionnalités que vous pouvez activer pour éviter les attaques par déni de service, mais vous ne pouvez pas simplement suivre les adresses IP que vous avez vues trop souvent trop récemment et leur envoyer un message 403 Forbidden avec un message leur demandant d'attendre une seconde.

Si pour une raison quelconque vous ne pouvez pas compter sur REMOTE_ADDR comme étant spécifique à l'utilisateur (tout le monde derrière le même pare-feu, etc.), vous pouvez créer un défi dans le formulaire de connexion et faire en sorte que le navigateur distant effectue un calcul détaillé (par exemple, facteur un nombre) que vous pouvez vérifier rapidement côté serveur (avec une multiplication rapide).

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