harmlessprince/superban

当客户端耗尽请求后,完全禁止客户端一段时间

1.0.0 2023-12-20 16:24 UTC

This package is auto-updated.

Last update: 2024-09-20 18:42:39 UTC


README

SuperBan是一个Laravel中间件包,帮助您管理和控制应用程序的入站请求速率。在需要防止滥用、限制特定路由或路由组请求数量以及必要时实施临时封禁的情况下,这可能很有用。

该包使用令牌桶算法设计。

以下是谷歌对算法的简要说明

令牌桶是用于分组交换和电信网络的一种算法。它可以用来检查数据传输(以数据包的形式)是否遵守定义的带宽和突发性(流量流不均匀或变化的度量)的限制。

在Superban包的概念中,以下是该包如何工作的简要说明。

中间件有一个名为maximumRequest的第一个参数。这个最大请求参数代表我们的令牌,并与缓存中的键相关联。因此,每个进入我们服务器的请求都会消耗一个令牌;如果没有令牌,则拒绝请求。如果客户端在指定的时间内尝试再次访问同一端点,客户端将被禁止访问特定路由,封禁时间为提供的封禁时间。

注意:所有提供的参数都应按分钟计算。

安装

composer require harmlessprince/superban

一旦安装了Superban包,该包将被自动加载,这个包是用php 8.1构建的。任何支持PHP 8.1的Laravel版本都将自动加载此包;但是,如果您想自己添加。

打开config/app.php,并将以下内容添加到providers键中。

'providers' => [
    // other service providers
    Harmlessprince\SuperBan\SuperBanServiceProvider::class,
],

配置

默认缓存驱动器是file;您可以通过环境变量将其更改为Laravel支持的任何缓存驱动器,如下所示

SUPER_BAN_CACHE_DRIVER=redis

您可以使用以下命令发布配置文件

php artisan vendor:publish --provider="Harmlessprince\SuperBan\SuperBanServiceProvider" --tag=superban-config

一个名为superban.php的配置文件(包含默认值)将被放置在您的config目录中

<?php
return [
    /*
    |--------------------------------------------------------------------------
    | Default Cache-Store
    |--------------------------------------------------------------------------
    |
    | This option controls the default cache connection that gets used while
    | using this caching library in superban. This connection is used when another is
    | not explicitly specified when executing a given caching function within the superban        libary.
    |
    | ** All laravel cache stores are supported **
    |
    */
    'cache_manager' => env('SUPER_BAN_CACHE_DRIVER', 'file'),

    /*
   |--------------------------------------------------------------------------
   | Default Request Key
   |--------------------------------------------------------------------------
   |
   | This option controls the default request key that gets used to
   | identify the client accessing your server.
   | Supported request keys are: "id"(if user is authenticated), "email"(if user is              authenticated), "ip"
   |
   |
   */
    'default_request_key' => env('SUPER_BAN_DEFAULT_REQUEST_KEY', 'ip'),
];

用法

要在您的路由中使用SuperBan中间件,您可以像使用其他中间件一样应用它。例如,在您的路由文件或控制器中

您可以通过提供附加参数来自定义SuperBan的行为

  • 最大请求次数:指定间隔内允许的最大请求数量(默认:200)。

  • 分钟间隔:允许最大请求的时长窗口(默认:2分钟)。

  • 封禁时长(分钟):如果客户端超出最大请求次数,客户端被封禁的时长(默认:1440分钟或24小时)。

Route::middleware('superban')->get('/user', function (Request $request) {
     return ["hello" => 'World'];
});



Route::get('/jane', function (Request $request) {
    return ["hello" => 'World'];
})->middleware('superban:200,2,60');


Route::middleware(['superban:200,2,1440])->group(function () {
   Route::post('/thisroute', function () {
       // ...
   });
 
   Route::post('anotherroute', function () {
       // ...
   });
});

异常

  • SuperBanClientBannedException:当客户端被封禁时抛出。

  • SuperBanTooManyRequestException:当客户端超出最大允许请求次数时抛出。

  • SuperBanInvalidMaxRequestParamException:当提供的最大请求参数方法既不是数值也不是正整数时抛出此异常。

  • SuperBanInvalidIntervalParamException:当提供的间隔参数方法既不是数值也不是正整数时抛出此异常。

  • SuperBanInvalidBanTimeParamException:当提供的封禁时间参数既不是数值也不是正整数时抛出此异常。

额外

当您在路由中使用中间件时,该包会在应用程序的每个响应中添加一些头部信息,如下所示

X-Superban-Ratelimit-Limit: 2
X-Superban-Ratelimit-Remaining: 0
X-Superban-Retry-After: 18

下面的响应头表明客户端已超出最大请求数量,可以在18秒后重试。

测试

composer test

测试结果应如下所示

Super Ban Cache Manager (Harmlessprince\SuperBan\Tests\Unit\SuperBanCacheManager)
 ✔ It is an instance of cache manager

Super Ban Middleware (Harmlessprince\SuperBan\Tests\Feature\SuperBanMiddleware)
 ✔ Invalid param throws an internal server error
 ✔ Valid param return goes to next middleware
 ✔ Client get too many after exhausting max request
 ✔ Client first too many request then get they have banned

Super Ban Service (Harmlessprince\SuperBan\Tests\Unit\SuperBanService)
 ✔ Invalid max requests param
 ✔ Invalid interval param
 ✔ Invalid ban time param
 ✔ Non umeric values params
 ✔ Zero max requests param
 ✔ Zero interval param
 ✔ Zero ban time param

Super Ban Service Provider (Harmlessprince\SuperBan\Tests\Unit\SuperBanServiceProvider)
 ✔ It registers config
 ✔ It binds superban cache repository

OK (14 tests, 19 assertions)

作者

姓名:Adewuyi Taofeeq
电子邮件:realolamilekan@gmail.com
LinkedIn:Adewuyi Taofeeq Olamikean

许可证

MIT