akrabat/ip-address-middleware

PSR-15 中间件,用于确定客户端 IP 地址并将其存储为 ServerRequest 属性

2.3.0 2024-07-15 17:53 UTC

This package is auto-updated.

Last update: 2024-09-15 18:16:45 UTC


README

PSR-15 中间件,用于确定客户端 IP 地址并将其存储为名为 ip_addressServerRequest 属性。它可选地检查各种常见代理头,然后回退到 $_SERVER['REMOTE_ADDR']

Build status

配置

构造函数接受 4 个参数,可用于配置此中间件。

检查代理头

注意,如果构造函数的第一个参数设置为 true,则仅检查代理头。如果设置为 false,则仅使用 $_SERVER['REMOTE_ADDR']

可信代理

如果您配置为检查代理头(第一个参数为 true),则必须作为第二个参数提供一个可信代理的数组。如果数组为空,则始终评估代理头,这不被推荐。如果数组不为空,则它必须包含带有 IP 地址的字符串(允许在任意部分使用通配符 *)或 CIDR 表示法中的网络。其中之一必须与 $_SERVER['REMOTE_ADDR'] 变量匹配,以便允许评估代理头 - 否则将返回 REMOTE_ADDR 本身。

属性名称

默认情况下,属性的名称是 'ip_address'。可以通过第三个构造函数参数更改此名称。

要检查的头部

默认情况下,此中间件检查 'Forwarded'、'X-Forwarded-For'、'X-Forwarded'、'X-Cluster-Client-Ip' 和 'Client-Ip' 头部。您可以使用第四个构造函数参数替换此列表。

如果您使用 nginx,则应设置此值为

$headersToInspect = [
    'X-Real-IP',
    'Forwarded',
    'X-Forwarded-For',
    'X-Forwarded',
    'X-Cluster-Client-Ip',
    'Client-Ip',
];

如果您使用 CloudFlare,则根据文档,您应将此设置为

$headersToInspect = [
    'CF-Connecting-IP',
    'True-Client-IP',
    'Forwarded',
    'X-Forwarded-For',
    'X-Forwarded',
    'X-Cluster-Client-Ip',
    'Client-Ip',
];

安全考虑

恶意客户端可能向您的代理发送任何头,包括任何代理头,包含任何 IP 地址。如果您的代理简单地将另一个 IP 地址添加到头部,攻击者可以发送一个伪造的 IP。确保以正确的方式设置您的代理,从原始请求中删除发送的(可能伪造的)头部,并用正确的值替换它们(即在代理服务器上当前使用的 REMOTE_ADDR)。

如果您的网络环境设置不正确,则该库无法通过设计确保您获得正确和可信的结果。

安装

composer require akrabat/ip-address-middleware

在 Mezzio 中,将 Mezzio/config/ip_address.global.php.dist 复制到您的 Mezzio 应用程序 config/autoload 目录中,作为 ip_address.global.php

使用

在 Slim 3 中

$checkProxyHeaders = true; // Note: Never trust the IP address for security processes!
$trustedProxies = ['10.0.0.1', '10.0.0.2']; // Note: Never trust the IP address for security processes!
$app->add(new RKA\Middleware\IpAddress($checkProxyHeaders, $trustedProxies));

$app->get('/', function ($request, $response, $args) {
    $ipAddress = $request->getAttribute('ip_address');

    return $response;
});

在 Laminas 或 Mezzio 中,将它们添加到您的 pipeline.php 配置的正确阶段,通常就在 DispatchMiddleware 之前

# config/pipeline.php
# using default config
$app->add(RKA\Middleware\IpAddress::class);

如有必要,请更新您的 .env 文件,包含 /config/autoload/ip_address.global.php 中找到的环境变量。

测试

  • 代码样式:$ vendor/bin/phpcs
  • 单元测试:$ vendor/bin/phpunit
  • 代码覆盖率:$ vendor/bin/phpunit --coverage-html ./build