los / los-rate-limit
PHP速率限制中间件
4.0.1
2023-10-30 12:39 UTC
Requires
- php: ^8.1
- laminas/laminas-diactoros: ^2.0
- mezzio/mezzio-problem-details: ^1.0
- psr/container: ^2.0
- psr/http-message: ^1.0
- psr/http-server-middleware: ^1.0
- psr/simple-cache: ^1.0 || ^2.0 || ^3.0
Requires (Dev)
- doctrine/coding-standard: ^11.0
- php-coveralls/php-coveralls: ^2.1
- phpstan/phpstan: ^1.2
- phpunit/phpunit: ^9.0
- squizlabs/php_codesniffer: ^3.4
README
LosRateLimit 是一个 PHP 中间件,用于实现速率限制。
首先,中间件会查找 X-Api-Key 头部作为密钥。如果没有找到,它将回退到远程 IP。
每个都有自己的限制(见下面的配置)。
注意!此中间件不验证 Api 密钥,您必须在之前添加一个中间件来验证它。
要求
- PHP >= 8.0
- Psr\SimpleCache 实现
安装
composer require los/los-rate-limit
配置
'los' => [ 'rate-limit' => [ 'max_requests' => 100, 'reset_time' => 3600, 'ip_max_requests' => 100, 'ip_reset_time' => 3600, 'api_header' => 'X-Api-Key', 'trust_forwarded' => false, 'prefer_forwarded' => false, 'forwarded_headers_allowed' => [ 'Client-Ip', 'Forwarded', 'Forwarded-For', 'X-Cluster-Client-Ip', 'X-Forwarded', 'X-Forwarded-For', ], 'forwarded_ip_index' => null, 'headers' => [ 'limit' => 'X-RateLimit-Limit', 'remaining' => 'X-RateLimit-Remaining', 'reset' => 'X-RateLimit-Reset', ], 'keys' => [ 'b9155515728fa0f69d9770f7877cb50a' => [ 'max_requests' => 100, 'reset_time' => 3600, ], ], 'ips' => [ '127.0.0.1' => [ 'max_requests' => 100, 'reset_time' => 3600, ], ], 'hash_ips' => false, 'hash_salt' => 'Los%Rate', ], ],
max_requests
在重置时间(使用 API 密钥)之前允许多少个请求reset_time
在多少秒后计数器将重置(使用 API 密钥)ip_max_requests
在重置时间(使用远程 IP 密钥)之前允许多少个请求ip_reset_time
在多少秒后计数器将重置(使用远程 IP 密钥)api_header
从中获取 API 密钥的头部名称trust_forwarded
如果 X-Forwarded(和类似)头部可以信任。如果不可以,则仅使用 $_SERVER['REMOTE_ADDR']。prefer_forwarded
是否应优先使用转发头部而不是远程地址,例如,如果所有请求都通过一个路由组件或反向代理以可预测的方式转发。除非您的应用程序只能通过这种方式访问,否则这不是一个好主意。forwarded_headers_allowed
包含您信任的源 IP 地址的头部字符串数组forwarded_ip_index
如果为 null(默认),则使用 XFF 头部中的第一个合理的 IP(从左到右读取)。如果为数字,则仅使用特定的 IP 索引。使用-2
可从列表中获得倒数第二个 IP,这在头部始终以...<client_ip>, <router_ip>
结尾时可能是有意义的。或者使用0
仅使用第一个 IP(如果它不是有效的,则停止)。与prefer_forwarded
类似,这仅在您的应用程序始终通过可预测的跃点访问且控制头部时才有意义 - 记住这些很容易在初始请求上伪造。keys
为每个 API 密钥指定不同的 max_requests/reset_timeips
为每个 IP 指定不同的 max_requests/reset_timehash_ips
在存储之前启用 IP 地址的哈希。这对于在基于文件系统的缓存实现和与 IPv6 地址一起工作时非常有用。如果设置为true
,将使用盐化的 MD5 哈希。hash_salt
此设置允许您在使用哈希 IP 地址时可选地定义一个自定义盐。仅在hash_ips
为true
时有效。
上述值表示用户每小时可以触发 100 个请求。
如果您想禁用 IP 访问(例如,仅允许通过 X-Api-Key 访问),只需将 ip_max_requests 设置为 0(零)即可。
用法
只需将中间件添加为第一个中间件之一。
提供的工厂使用容器获取 \Psr\SimpleCache\CacheInterface(PSR-16)。大多数实现都提供 PSR-6 和 PSR-16,或者至少是一个装饰器。推荐:zend-cache 或 symfony/cache。
Laminas / Mezzio
如果您正在使用 mezzio-skeleton,可以将 config/los-rate-limit.local.php.dist
复制到 config/autoload/los-rate-limit.local.php
,并根据您的需求修改配置。