
Besseres PHP-Rate-Limiting mit Redis.
Limitrr PHP ist stark von meiner anderen Bibliothek inspiriert, Limitrr, die für NodeJS erstellt wurde. Schauen Sie es sich hier an.
Limitrr PHP ermöglicht es Benutzern, Rate-Limiting einfach in ihre Anwendung zu integrieren. Im Gegensatz zu anderen ähnlichen Paketen erlaubt dieses Dienstprogramm nicht nur die Begrenzung nach der Anzahl der Anfragen, sondern auch nach der Anzahl der abgeschlossenen Aktionen (z.B. das Erlauben einer bestimmten Anzahl erfolgreich erstellter Konten innerhalb eines Zeitraums) und die Einschränkung mit benutzerdefinierten Optionen. Darüber hinaus sind benutzerdefinierte Diskriminatoren möglich – Sie müssen nicht mehr nur nach der IP des Benutzers begrenzen.
Diese Bibliothek bietet auch eine Middleware-Funktion zum einfachen Ratelimiting verschiedener Routen innerhalb eines SlimPHP-Projekts.
Wenn Ihnen dieses Projekt gefällt, geben Sie ihm bitte einen 🌟 auf GitHub.
Pull Requests sind willkommen
Sie können die limitrr-php-Bibliothek installieren, indem Sie den folgenden Befehl in Ihrem Terminal ausführen (vorausgesetzt, Sie haben Composer installiert)
composer require eddiejibson/limitrr-php "^1.0"
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();
Rückgabe: Array
$limitrr->get([
"discriminator" => $discriminator, //Erforderlich
"route" => $route, //Nicht erforderlich, Standard wird angenommen
"type" => $type //Nicht erforderlich
]);
Müssen als Array an die Funktion übergeben werden
default-Route abgerufen.requests oder completed angeben, und nur dieser wird als Ganzzahl zurückgegeben.$limitrr->get([
"discriminator" => $discriminator,
"type" => $type,
"route" => $route
]); //Außer discriminator sind alle Parameter optional.
//Wenn type nicht an die Funktion übergeben wird, gibt sie
//sowohl die Anzahl der Anfragen als auch der abgeschlossenen Aktionen zurück
//Wobei discriminator das ist, was begrenzt wird
//z. B. x abgeschlossene Aktionen/Anfragen pro Diskriminator
$limitrr->get(["discriminator" => $discriminator]);
//Dies ist in der Regel die IP des Benutzers.
$limitrr->get(["discriminator" => $ip]);
//Dies gibt sowohl die Anzahl der Anfragen als auch der abgeschlossenen Aktionen zurück, die unter dem
//angegebenen Diskriminator in einem Objekt gespeichert sind. Sie können so damit umgehen:
$result = $limitrr->get(["discriminator" => $ip]);
echo $result["requests"] + " Requests";
echo $result["completed"] + " Completed";
//Das obige Beispiel würde die Anzahl der Anfragen und erledigten Aufgaben von der Standardroute
//abrufen. Wenn Sie Werte von einer anderen Route abrufen möchten, können Sie
//diese ebenfalls angeben. Dies kann so erfolgen:
$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";
//Sie können auch nur einen einzigen Wert abrufen – statt sowohl Anfragen als auch Erledigte.
$result = $limitrr->get(["discriminator" => $ip, "route" => "exampleRouteName", "type" => "completed"]);
echo $result["completed"] . " Completed tasks made through the route exampleRouteName";
Rückgabe: Integer
$limitrr->get([
"discriminator" => $discriminator, //Erforderlich
"route" => $route, //Nicht erforderlich, Standard wird angenommen
]);