los/los-rate-limit

PHP速率限制中间件

4.0.1 2023-10-30 12:39 UTC

This package is auto-updated.

Last update: 2024-08-30 01:23:11 UTC


README

Build Status Latest Stable Version Total Downloads

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_time
  • ips 为每个 IP 指定不同的 max_requests/reset_time
  • hash_ips 在存储之前启用 IP 地址的哈希。这对于在基于文件系统的缓存实现和与 IPv6 地址一起工作时非常有用。如果设置为 true,将使用盐化的 MD5 哈希。
  • hash_salt 此设置允许您在使用哈希 IP 地址时可选地定义一个自定义盐。仅在 hash_ipstrue 时有效。

上述值表示用户每小时可以触发 100 个请求。

如果您想禁用 IP 访问(例如,仅允许通过 X-Api-Key 访问),只需将 ip_max_requests 设置为 0(零)即可。

用法

只需将中间件添加为第一个中间件之一。

提供的工厂使用容器获取 \Psr\SimpleCache\CacheInterface(PSR-16)。大多数实现都提供 PSR-6 和 PSR-16,或者至少是一个装饰器。推荐:zend-cachesymfony/cache

Laminas / Mezzio

如果您正在使用 mezzio-skeleton,可以将 config/los-rate-limit.local.php.dist 复制到 config/autoload/los-rate-limit.local.php,并根据您的需求修改配置。