akrabat/ ip-address-middleware
PSR-15 中间件,用于确定客户端 IP 地址并将其存储为 ServerRequest 属性
Requires
- php: ^7.2 || ^8.0
- psr/container: ^1.0 || ^2.0
- psr/http-message: ^1.0 || ^2.0
- psr/http-server-middleware: ^1.0
Requires (Dev)
- laminas/laminas-diactoros: ^2.4 || ^3.0
- phpunit/phpunit: ^8.5.8 || ^9.4
- squizlabs/php_codesniffer: ^3.2
Replaces
README
PSR-15 中间件,用于确定客户端 IP 地址并将其存储为名为 ip_address
的 ServerRequest
属性。它可选地检查各种常见代理头,然后回退到 $_SERVER['REMOTE_ADDR']
。
配置
构造函数接受 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