La limite de taux est ouverte

Aujourd'hui, je veux mettre à la disposition de tous un script PHP (Hypertext Preprocesseur) qui permet de ralentir tout utilisateur si les limites fixées pour le chargement d'une page web sont atteintes. Si vous cherchez quelque chose pour arrêter les attaques DDOS, vous n'êtes pas au bon endroit; si vous cherchez quelque chose pour empêcher l'accès aux pages Web en fonction du nombre maximum de requêtes en un temps limité, ce petit script PHP peut vous aider. Que ce soit pour limiter l'accès à une API (Application Programming Interface) ou pour limiter l'accès à des zones sensibles (comme ne permettant pas une mise à jour continue de la page dans des zones critiques telles que l'enregistrement ou l'authentification), vous êtes au bon endroit pour apprendre à le faire de manière professionnelle, rapide et efficace. Pour ce faire, nous avons besoin d'une base de données "no-sql" et précisément pour ce script, nous utilisons une base de données encore plus performante avec la technologie "in-memory", c'est-à-dire une base de données qui écrit sur la mémoire volatile. Quand je publie un script, j'aime le faire librement, sans dépendances particulières, sans le verrouiller dans des fonctions ou des classes si cela n'est pas nécessaire; cependant, il est encore possible de créer une fonction ou même de l'encapsuler dans une classe, comme vous le souhaitez.

C'est le script [Licence Apache-2.0Oui.

*?php

***
* taux limite bref résumé.
*
* @version 1.0
* @auteur oskar @ myincorporation.org
*
* $time_period = La période est spécifiée en secondes (3600 secondes est 1 heure, 86400 secondes est 1 jour)
* $max_calls_limit = appels maximum autorisés dans cette période
* $total_user_calls = les appels toal effectués par l'utilisateur
* En-têtes des clients :
* X-RateLimit-Limit: Il est pour fournir la capacité maximale.
* X-RateLimit-Remaining : Il s'agit de clarifier les limites de remaniement (tokens).
* X-RateLimit-Reset: l'heure à laquelle la limite de vitesse se réinitialise, spécifiée en heure UTC (en secondes)
*/

$redis = nouveau Redis();
//Connexion à la base de données de la mémoire redis
$redis->connect('127.0.0.1', 6379);
//mot de passe pour redis
(');
//choisir la base de données en mémoire (peut être changé de 0 à max 16)
$redis->select(0);

//Vous pouvez modifier cette partie pour définir des valeurs personnalisées
$max_calls_limit = 500;
_période_temps = 3600;
$total_user_calls = 0;
//Fin de la partie modifiable

//Il est possible de modifier cette partie pour implémenter le système d'authentification, il suffit de changer la variable $user_code_ratelimit avec le jeton utilisé par le système d'authentification.
//Obtenez l'IP du visiteur (aussi si derrière le proxy)
si (permettre($_) SERVEUR["HTTP_CF_CONNECTING_IP"]):
$_SERVER['REMOTE_ADDR'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
$_SERVER['HTTP_CLIENT_IP'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
endif;
$client = @$_SERVER['HTTP_CLIENT_IP'];
$forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
$remote = $_SERVER['REMOTE_ADDR''];

si (filter_var($client, FILTER_VALIDATE_IP) :
$user_code_ratelimit = $client;
Sinon (filter_var($forward, FILTER_VALIDATE_IP)):
$user_code_ratelimit = $forward;
Sinon:
$user_code_ratelimit = $remote;
endif;
//Fin de la partie modifiable

//hash le code utilisateur créé
$user_code_ratelimit_hashed = hash('sha256', $user_code_ratelimit);

//vérifier la base de données in-memory et la mettre à jour si nécessaire
si (!$redis->existe($user_code_ratelimit_hashed)):
$redis->set($user_code_ratelimit_hashed, 1);
$redis->expire($user_code_ratelimit_hashed, $time_period);
$total_user_calls = 1;
Sinon:
$redis->INCR($user_code_ratelimit_hashed);
$total_user_calls = $redis->get($user_code_ratelimit_hashed);
Si ($total_user_calls > $max_calls_limit):
écho « La limite de taux est dépassée. Veuillez réessayer plus tard.";
sortie();
endif;
endif;

//settings en-tête pour le client (important: mettre ceci avant toute sortie, si ce n'est pas possible commenter ces 3 lignes)
header('X-RateLimit-Limit: '.$max_calls_limit);
header('X-RateLimit-Remaining: '.$max_calls_limit-$total_user_calls);
header('X-RateLimit-Reset: '.$time_period);
?>

Vous pouvez voir le script directement sur mon Github ici: https://github.com/OskarCosimo/rate-limit/

Comment fonctionne le script ?

Ce script contient des commentaires utiles qui peuvent être utilisés pour modifier les variables comme désiré. La connexion à la base de données se produit facilement en une seule étape, via l'appel $redis->connect(‘127.0.0.1, 6379) où 127.0.0.1 est l'adresse interne du serveur (localhost) et 6379 est le port utilisé à partir de la base de données (c'est la variable par défaut); Montant total est le mot de passe de la base de données (réglé pendant la phase d'installation) tandis que la variable $redis->select(0) est le nombre de la base de données à utiliser (Redis peut avoir un maximum de 16 bases de données différentes, ceci est utile si vous voulez créer plusieurs scripts qui lisent à partir de différentes bases de données). Les _période_temps variable et $max_calls_limite variable sont les deux seules variables qui devraient être modifiées (en plus de celles relatives à la connexion de la base de données) et consistent à spécifier la période (exprimée en secondes) et le nombre maximal de requêtes (int sans décimales) qui est possible à faire. La variable $user_code_ratelimit est celui qui prend soin d'avoir un identifiant de l'utilisateur qui a fait la demande au serveur, par défaut nous prenons l'adresse IP du visiteur mais cette variable peut également être définie avec le code utilisateur enregistré sur une base de données qui se réfère à l'authentification de l'utilisateur; ce script, par conséquent, peut également être intégré à n'importe quel système d'authentification et avec une petite modification il est également possible d'augmenter le nombre de requêtes autorisées pour les utilisateurs déjà enregistrés.

Qu'est-ce que Redis

Redis est un magasin de données en mémoire ouvert qui peut être utilisé comme base de données, cache ou courtier de messages. Il est souvent utilisé pour la mise en cache des pages Web et la réduction de la charge sur les serveurs. Redis dispose également de certaines fonctionnalités qui le rendent attrayant pour l'utilisation comme base de données, comme le support pour les transactions et la publication/abonnement de messages.

Comment installer Redis sur votre serveur

Le guide officiel pour installer Redis dans chaque système d'exploitation est ici: https://redis.io/docs/latest/operation/oss_and_stack/install/install-redis

Ce système est-il utilisé sur MYETV?

Oui, ce système est utilisé et sera utilisé plus fréquemment pour protéger contre les nombreux MYETV accès; pour augmenter le nombre de demandes disponibles, il sera nécessaire de s'inscrire sur la plateforme.