harmlessprince / superban
当客户端耗尽请求后,完全禁止客户端一段时间
Requires
- php: ^8.1
Requires (Dev)
- orchestra/testbench: ^6.0
- phpunit/phpunit: ^9.0
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