Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
limitrr-php — Лучшее ограничение скорости PHP с использованием Redis. | Kitploit
Инструменты/GitHubGitHub/eddiejibson/limitrr-php
Аутентификация и авторизацияСкриптинг и автоматизацияВеб-безопасностьУтилиты и фреймворкиБезопасность API
GitHubeddiejibson/limitrr-php

limitrr-php

Лучшее ограничение скорости PHP с использованием Redis.

Репозиторий
20656 лет назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
chae

Легкое ограничение скорости в PHP с использованием Redis.

Limitrr PHP сильно вдохновлен моей другой библиотекой Limitrr, созданной для NodeJS. Посмотрите здесь.

Limitrr PHP позволяет пользователям легко интегрировать ограничение скорости в свои приложения. В отличие от других подобных пакетов, эта утилита позволяет ограничивать не только количество запросов, но и количество выполненных действий (например, разрешая определенное количество успешно созданных аккаунтов за промежуток времени) и накладывать такие ограничения с помощью пользовательских опций. Кроме того, возможны пользовательские дискриминаторы — вам больше не нужно ограничивать только по IP-адресу пользователя.

Эта библиотека также предоставляет middleware-функцию для легкого ограничения скорости различных маршрутов в проекте SlimPHP.

Если вы цените этот проект, пожалуйста, поставьте 🌟 на GitHub.

Pull Request'ы приветствуются

Установка

Вы можете установить библиотеку limitrr-php, выполнив следующую команду в терминале (при условии, что у вас установлен composer скачать).

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

Краткое руководство

Базовое использование

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();

Получение значения определенного ключа

limitrr->get()

Возвращает: Массив

root@kitploit:~
$limitrr->get([
    "discriminator" => $discriminator, //Required
    "route" => $route, //Not required, default is assumed
    "type" => $type //Not required
]);
Параметры ->get()

Должны быть переданы в функцию в виде массива

  • discriminator: Обязательный Дискриминатор — объект, который ограничивается (например, x количество выполненных действий на дискриминатор).
  • route: Строка Из какого маршрута следует извлекать значения? Если не задано, будет получать счетчики из маршрута default.
  • type: Строка Вместо получения обоих значений вы можете указать requests или completed в этом ключе, и будет возвращено только это значение в виде целого числа.
Примеры ->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";

Учет выполненных действий/задач

limitrr->complete()

Возвращает: Целое число

root@kitploit:~
$limitrr->get([
    "discriminator" => $discriminator, //Required
    "route" => $route, //Not required, default is assumed
]);
Параметры ->complete()

Должны быть переданы в функцию в виде массива

  • discriminator: Обязательный Дискриминатор — объект, который ограничивается (например, x количество выполненных действий на дискриминатор).
  • route: Строка В какой маршрут следует вставлять значения? Если не задано, будет использовать счетчики из маршрута default.

Удаление значений из определенных ключей запросов/выполненных действий

limitrr->reset()

Возвращает: Логическое значение

root@kitploit:~
$limitrr->reset([
    "discriminator" => $discriminator, //Required
    "route" => $route, //Not required, default is assumed,
    "type" => $type //Not required
]);
Параметры ->reset()

Должны быть переданы в функцию в виде массива

  • discriminator: Обязательный Дискриминатор — объект, который ограничивается (например, x количество выполненных действий на дискриминатор).
  • route: Строка Из какого маршрута следует сбросить значения? Если не задано, будет сброшены счетчики из маршрута default.
  • type: Строка Какой счетчик вы хотите сбросить? requests или completed? Если не задано, будут удалены оба.
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
}

Конфигурация

redis

Обязательно: нет

Тип: Массив или строка

Описание: Информация о подключении к Redis.

Либо передайте строку, содержащую URI экземпляра Redis, либо объект с информацией о подключении:

  • port: Целое число Порт Redis. По умолчанию: 6379
  • host: Строка Хост Redis. По умолчанию: "127.0.0.1"
  • password: Строка Пароль Redis. По умолчанию: ""
  • database: Целое число БД Redis. По умолчанию: 0

Пример массива/строки redis, который можно передать в 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

Обязательно: нет

Тип: Массив

Описание: Различные опции, связанные с Limitrr.

  • keyName: Строка Имя ключа, под которым будут храниться все запросы. В основном служит для эстетических целей и мало на что влияет. Однако его следует изменять при каждой инициализации основного класса, чтобы избежать конфликтов. По умолчанию: "limitrr"
  • errorStatusCode: Целое число Код состояния, возвращаемый при ограничении скорости пользователя. По умолчанию 429 (Too Many Requests).

Пример объекта options, который можно передать в 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

Обязательно: нет

Тип: Массив

Описание: Определение ограничений маршрутов.

Внутри объекта routes вы можете определить множество отдельных маршрутов и задать для них пользовательские правила. Доступные пользовательские правила:

  • requestsPerExpiry: Целое число Сколько запросов может быть принято до ограничения пользователя? По умолчанию: 100
  • completedActionsPerExpiry: Целое число Сколько выполненных действий может быть принято до ограничения пользователя? Это полезно для таких действий, как регистрация пользователя — у них может быть определенное количество запросов, но другое (очевидно, меньшее) количество «выполненных действий». Таким образом, если пользователи недавно успешно зарегистрировались несколько раз с одного IP (или другого дискриминатора), их можно ограничить. Им может быть разрешено 100 запросов за определенный период для общей проверки и т.п., но лишь небольшая доля этого для интенсивных процедур. По умолчанию используется значение из requestsPerExpiry или 5, если не задано.
  • expiry: Целое число Как долго должны храниться запросы (в секундах) перед сбросом в 0? Если установлено -1, значения никогда не истекают и остаются такими навсегда или должны быть удалены вручную. По умолчанию: 900 (15 минут).
  • completedExpiry: Целое число Как долго должны храниться «выполненные действия» (например, количество зарегистрированных пользователей с определенного IP или другого дискриминатора) в секундах перед сбросом в 0? Если установлено -1, такие значения никогда не истекают и остаются такими навсегда или должны быть удалены вручную. По умолчанию используется значение из expiry или 900 (15 минут), если не задано.
  • errorMsgs: Объект Отдельные сообщения об ошибках для слишком большого количества запросов и слишком большого количества выполненных действий. Им присвоены соответствующие имена ключей «requests» и «actions». Они будут возвращены пользователю при ограничении скорости. Если строка не задана в , будет использоваться по умолчанию: . Кроме того, если значение не задано в , будет использоваться строка из . Если и она не задана, значением будет .

Пример массива 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
    ]
]
Скачать инструмент
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."