Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
limitrr-php — Meilleure limitation de débit PHP avec Redis. | Kitploit
Outils/GitHubGitHub/eddiejibson/limitrr-php
Authentification et AutorisationScripting et AutomatisationSécurité WebUtilitaires et FrameworksSécurité des API
GitHubeddiejibson/limitrr-php

limitrr-php

Meilleure limitation de débit PHP avec Redis.

Voir le dépôt
2065il y a 6 ansVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager
chae

Limitation de débit légère en PHP utilisant Redis.

Limitrr PHP est très fortement inspiré de mon autre bibliothèque, Limitrr, créée pour NodeJS. Découvrez-la ici

Limitrr PHP permet aux utilisateurs d'intégrer facilement la limitation de débit dans leur application. Contrairement à d'autres paquets similaires, cet utilitaire permet à l'utilisateur de limiter non seulement le nombre de requêtes, mais aussi le nombre d'actions terminées (par exemple, autoriser qu'un certain nombre de comptes soient créés avec succès dans un laps de temps donné) et de soumettre ces limites à des options personnalisées. De plus, des discriminateurs personnalisés sont possibles : vous n'avez plus à limiter uniquement par l'IP de l'utilisateur.

Cette bibliothèque fournit également une fonction middleware pour limiter facilement le débit des différentes routes que vous pouvez avoir dans un projet SlimPHP.

Si vous appréciez ce projet, merci de le 🌟 sur GitHub.

Les pull requests sont les bienvenues

Installation

Vous pouvez installer la bibliothèque limitrr-php en exécutant la commande suivante dans votre terminal (en supposant que composer est installé)

root@kitploit:~
composer require eddiejibson/limitrr-php "^1.0"

Guide rapide

Utilisation de base

root@kitploit:~
require "/vendor/autoload.php"; //Require composer's autoload

$options = [
    //Redis keystore information
    "redis" => [
        "host" => "666.chae.sh",
        "port" => 6379,
        "password" => "supersecret",
    ],
    "routes" => [
        "default" => [
            "requestsPerExpiry" => 5,
        ],
    ],

];

//Initialize the Limitrr class and pass the options defined above into it
//Note that the options are not required.
$limitrr = new \eddiejibson\limitrr\Limitrr($options);

//Various examples like this can be found further into the documentation,
//for each function.
$result = $limitrr->get(["discriminator" => $ip]);
echo $result["requests"] + " Requests";
echo $result["completed"] + " Completed";
//Note that this library is no means just for SlimPHP, it just happens to
//provide a middleware function for those who may need it.

//Usage within SlimPHP
$app = new Slim\App();

//Use the Limitrr SlimPHP middleware function, if you wish:
$app->add(new \eddiejibson\limitrr\RateLimitMiddleware($limitrr)); //Make sure to pass in the main Limitrr
//instance we defined above into the middleware function. This is mandatory.

//You can also add the get IP middleware function, it will append the user's real IP
//(behind Cloudflare or not) to the request.
$app->add(new \eddiejibson\limitrr\getIpMiddleware());

//Example usage within a route
$app->get("/hello/{name}", function ($request, $response, $args) {
    $name = $args["name"];
    $ip = $request->getAttribute('realip'); //Get the IP that was defined within Limitrr's get IP middleware function
    return $response->getBody()->write("Hello, ${name}. Your IP is ${ip}.");
});

//You do not have to app the middleware function to every single route, globally.
//You can do it indivually, too - along with passing options into such. Like so:
$app->get("/createUser/{name}", function ($request, $response, $args) {
    //Non intensive actions like simple verification will have a different limit to intensive ones.
    //and will only be measured in terms of each request via the middleware.
    //No further action is required.
    if (strlen($args["name"]) < 5) {
        //Dummy function creating user
        $res = $someRandomClass->registerUser();
        if ($res) {
            //Intensive actions like actually registering a user should have a
            //different limit to normal requests, hence the completedActionsPerExpiry option.
            //and should only be added to once this task has been completed fully
            //In this example, we will be limiting the amount of completed actions a certain IP can make.
            //Anything can be passed in here, however. For example, a email address or user ID.
            //$request->getAttribute('realip') was determined by calling the middleware earlier - getIpMiddleware()
            $limitrr->complete(["discriminator"] => $ip);
        }
    }
})->add(new \eddiejibson\limitrr\RateLimitMiddleware($limitrr, ["route"=>"createUser"]));
//You can also pass the route name within the limitrr middleware function

$app->run();

Obtenir la valeur d'une clé donnée

limitrr->get()

Renvoie: Tableau

root@kitploit:~
$limitrr->get([
    "discriminator" => $discriminator, //Required
    "route" => $route, //Not required, default is assumed
    "type" => $type //Not required
]);
Paramètres de ->get()

Doivent être passés à la fonction via un tableau

  • discriminator: Requis Correspond à l'élément limité (par ex. x actions terminées par discriminateur).
  • route: Chaîne De quelle route les valeurs doivent-elles être récupérées ? Si ce paramètre n'est pas défini, les compteurs proviendront de la route default.
  • type: Chaîne Au lieu de récupérer les deux valeurs, vous pouvez spécifier soit requests soit completed dans cette clé et seule cette valeur sera retournée sous forme d'entier.
Exemples pour ->get()
root@kitploit:~
$limitrr->get([
    "discriminator" => $discriminator,
    "type" => $type,
    "route" => $route
]); //Besides discriminator, all parameters are optional.
//If type is not passed into the function, it will
//return both the amount of requests and completed actions

//Where discriminator is the thing being limited
//e.g x amount of completed actions/requests per discriminator
$limitrr->get(["discriminator" => $discriminator]);

//This tends to be the user's IP.
$limitrr->get(["discriminator" => $ip]);
//This will return both the amount of requests and completed actions stored under the
//discriminator provided in an object. You can handle like this:
$result = $limitrr->get(["discriminator" => $ip]);
echo $result["requests"] + " Requests";
echo $result["completed"] + " Completed";

//The above example would get the request and completed task count from the default
//route. If you would like to retrieve values from a different route, you can specify
//this as well. It can be done like this:
$result = $limitrr->get(["discriminator" => $ip, "route" => "exampleRouteName"]);
echo $result["requests"] . " Requests made through the route exampleRouteName";
echo $result["completed"] . " Completed Tasks made through the route exampleRouteName";

//You may also only fetch only one type of value - instead of both requests and completed.
$result = $limitrr->get(["discriminator" => $ip, "route" => "exampleRouteName", "type" => "completed"]);
echo $result["completed"] . " Completed tasks made through the route exampleRouteName";

Nombre d'actions/tâches terminées

limitrr->complete()

Renvoie: Entier

root@kitploit:~
$limitrr->get([
    "discriminator" => $discriminator, //Required
    "route" => $route, //Not required, default is assumed
]);
Paramètres de ->complete()

Doivent être passés à la fonction via un tableau

  • discriminator: Requis Correspond à l'élément limité (par ex. x actions terminées par discriminateur).
  • route: Chaîne De quelle route les valeurs doivent-elles être insérées ? Si ce paramètre n'est pas défini, les compteurs proviendront de la route default.

Suppression des valeurs de certaines clés de requêtes/actions terminées

limitrr->reset()

Renvoie: Booléen

root@kitploit:~
$limitrr->reset([
    "discriminator" => $discriminator, //Required
    "route" => $route, //Not required, default is assumed,
    "type" => $type //Not required
]);
Paramètres de ->reset()

Doivent être passés à la fonction via un tableau

  • discriminator: Requis Correspond à l'élément limité (par ex. x actions terminées par discriminateur).
  • route: Chaîne De quelle route les valeurs doivent-elles être réinitialisées ? Si ce paramètre n'est pas défini, les compteurs de la route default seront réinitialisés.
  • type: Chaîne Quel compteur souhaitez-vous réinitialiser ? requests ou completed ? Si ce paramètre n'est pas défini, les deux seront supprimés.
root@kitploit:~
//Where discriminator is the thing being limited
//e.g x amount of completed actions/requests per discriminator
//This will remove both the amount of requests and completed action count
$limitrr->reset(["discriminator" => $discriminator]);

//This tends to be the user's IP.
$limitrr->reset(["discriminator" => $ip]);

//If you wish to reset counts from a particular route, this can be done as well.
//As the type is not specified, it will remove both the request and completed count
$result = $limitrr->reset([
    "discriminator" => $ip,
    "route" => "exampleRouteName"
]);
if ($result) {
    echo "Requests removed from the route exampleRouteName";
} else {
    //Do something else
}

//If you want to remove either one of the amount of requests or completed actions.
//but not the other, this can be done as well.
//The value passed in can either be "requests" or "completed".
//In this example, we will be removing the request count for a certain IP
$result = $limitrr->reset([
    "discriminator" => $ip,
    "type" => "requests"
]);
if ($result) {
    echo "Request count for the specified IP were removed"
} else {
    //do something else
}

Configuration

redis

Requis: false

Type: Tableau ou chaîne

Description: Informations de connexion à Redis.

Soit passez une chaîne contenant l'URI de l'instance Redis, soit un objet contenant les informations de connexion :

  • port: Entier Port Redis. Par défaut : 6379
  • host: Chaîne Nom d'hôte Redis. Par défaut : "127.0.0.1"
  • password: Chaîne Mot de passe Redis. Par défaut : ""
  • database: Entier Base de données Redis. Par défaut : 0

Exemple du tableau/chaîne Redis pouvant être passé à Limitrr

root@kitploit:~
    //Pass in a string containing a redis URI.
    "redis" => "redis://127.0.0.1:6379/0"
    //Alternatively, use an array with the connection information.
    "redis" => [
        "port" => 6379, //Redis Port. Required: false. Defaults to 6379
        "host" => "127.0.0.1", //Redis hostname. required: False. Defaults to "127.0.0.1".
        "password" => "mysecretpassword1234", //Redis password. Required: false. Defaults to null.
        "database" => 0 //Redis database. Required: false. Defaults to 0.
    ]

options

Requis: false

Type: Tableau

Description: Diverses options concernant Limitrr.

  • keyName: Chaîne Le nom de clé sous lequel toutes les requêtes seront stockées. Il sert surtout à des fins esthétiques et n'a que peu d'impact. Cependant, il doit être modifié à chaque initialisation de la classe principale pour éviter tout conflit. Par défaut : "limitrr"
  • errorStatusCode: Entier Code de statut à renvoyer lorsque l'utilisateur est limité. Par défaut : 429 (Trop de requêtes).

Exemple de l'objet options pouvant être passé à Limitrr

root@kitploit:~
"options" => [
    "keyName" => "myApp", //The keyname all of the requests will be stored under. Required: false. Defaults to "limitrr"
    "errorStatusCode" => 429 //Should important errors such as failure to connect to the Redis keystore be caught and displayed?
]

routes

Requis: false

Type: Tableau

Description: Définissez les restrictions de routes.

Dans l'objet routes, vous pouvez définir de nombreuses routes distinctes et définir des règles personnalisées pour chacune. Les règles personnalisées que vous pouvez définir sont :

  • requestsPerExpiry: Entier Combien de requêtes peuvent être acceptées avant que l'utilisateur ne soit limité ? Par défaut : 100
  • completedActionsPerExpiry: Entier Combien d'actions terminées peuvent être acceptées avant que l'utilisateur ne soit limité ? Cela est utile pour certaines actions comme l'enregistrement d'un utilisateur : ils peuvent avoir un certain nombre de requêtes, mais un nombre différent (évidemment plus faible) d'« actions terminées ». Ainsi, si des utilisateurs ont récemment été enregistrés avec succès plusieurs fois sous la même IP (ou un autre discriminateur), ils peuvent être limités. Ils peuvent, par exemple, être autorisés à effectuer 100 requêtes pour une certaine durée d'expiration pour la validation générale et autres, mais seulement une petite fraction de ce nombre pour les procédures intensives. Par défaut, la valeur définie dans requestsPerExpiry ou 5 si elle n'est pas définie.
  • expiry: Entier Combien de temps les requêtes doivent-elles être conservées (en secondes) avant d'être remises à 0 ? Si la valeur est -1, les valeurs n'expirent jamais et restent ainsi indéfiniment ou doivent être supprimées manuellement. Par défaut : 900 (15 minutes).
  • completedExpiry: Entier Combien de temps les « actions terminées » (comme le nombre d'utilisateurs enregistrés à partir d'une IP particulière ou d'un autre discriminateur) doivent-elles être conservées (en secondes) avant d'être remises à 0 ? Si la valeur est -1, ces valeurs n'expirent jamais et restent ainsi indéfiniment ou doivent être supprimées manuellement. Par défaut, la valeur définie dans expiry ou 900 (15 minutes) si elle n'est pas définie.
  • errorMsgs: Objet Messages d'erreur distincts pour un trop grand nombre de requêtes et un trop grand nombre d'actions terminées. Ils ont reçu les noms de clés respectifs "requests" et "actions". Le message correspondant sera renvoyé à l'utilisateur lorsqu'il est soumis à une limitation de débit. Si aucune chaîne n'est définie dans , la valeur par défaut sera . De plus, si aucune valeur n'est définie dans , elle prendra la chaîne trouvée dans . Ou, si celle-ci n'a pas non plus été définie, sera sa valeur.

Exemple du tableau routes

root@kitploit:~
"routes" => [
    //Overwrite default route rules - not all of the keys must be set,
    //only the ones you wish to overwrite
    "default" => [
        "expiry": 1000
    ],
    "exampleRoute" => [
        "requestsPerExpiry" => 100,
        "completedActionsPerExpiry" => 5,
        "expiry" => 900,
        "completedExpiry" => 900,
        "errorMsgs" => [
            "requests" => "As you have made too many requests, you are being rate limited.",
            "completed" => "As you performed too many successful actions, you have been rate limited."
        ]
    ],
    //If not all keys are set, they will revert to
    //the default values
    "exampleRoute2" => [
        "requestsPerExpiry" => 500
    ]
]
Télécharger l’outil
requests
"As you have made too many requests, you are being rate limited."
completed
requests
"As you performed too many successful actions, you have been rate limited."