zooxsmart/los-rate-limit

PHP 的速率限制中间件

1.0.2 2023-12-11 18:35 UTC

This package is auto-updated.

Last update: 2024-09-11 20:21:55 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 指定不同的 max_requests/reset_time,每个 API 密钥
  • ips 指定不同的 max_requests/reset_time,每个 IP
  • hash_ips 在存储之前启用 IP 地址的哈希。当使用基于文件系统的缓存实现并处理 IPv6 地址时特别有用。如果设置为 true,将使用加盐的 MD5 哈希。
  • hash_salt 此设置允许您在使用哈希 IP 地址时可选地定义自定义盐。仅在 hash_ips 为真时有效。

上述值表示用户每小时可以触发 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,并根据您的需求进行配置修改。