slam / psr7-get-client-ip
从ServerRequestInterface获取客户端IP
v1.1.0
2023-11-23 06:44 UTC
Requires
- php: ~8.2.0 || ~8.3.0
- psr/http-message: ^1.1 || ^2.0
Requires (Dev)
- infection/infection: ^0.27.8
- laminas/laminas-diactoros: ^3.3.0
- phpstan/phpstan: ^1.10.44
- phpstan/phpstan-phpunit: ^1.3.15
- phpunit/phpunit: ^10.4.2
- slam/php-cs-fixer-extensions: ^3.10
This package is auto-updated.
Last update: 2024-09-19 17:11:00 UTC
README
安装
composer require slam/psr7-get-client-ip
动机与用法
了解客户端的IP是区分好与坏行为者的需要,并采取适当的应对措施。在IPv4协议中,这是一个简单的工作(或者应该是 https://adam-p.ca/blog/2022/03/x-forwarded-for/)
- 如果行为者是好的,你取其IPv4并将其会话绑定到它,以减轻会话劫持。
- 如果行为者是坏的,你禁止其IPv4。
尽管在IPv6协议中情况不同:路由器的默认实现允许每个客户端在子网中选择和更改其IP,这至少是 /64
。速率限制和禁止必须考虑这一点,请参阅 https://adam-p.ca/blog/2022/02/ipv6-rate-limiting/
最佳方法仍在争议之中;这个库采取了以下方法
- 如果行为者是好的,则返回完整的IPv6地址
- 如果行为者是坏的,则返回
/64
相对子网地址
$request = new ServerRequest([ 'REMOTE_ADDR' => '1.2.3.4', ]); var_dump((new Psr7GetClientIp())->forGoodList($request)); // '1.2.3.4' var_dump((new Psr7GetClientIp())->forNaughtyList($request)); // '1.2.3.4' $request = new ServerRequest([ 'REMOTE_ADDR' => '2013:b0a7:5d31:fd03:7257:ae71:6cb9:8e1d', ]); var_dump((new Psr7GetClientIp())->forGoodList($request)); // '2013:b0a7:5d31:fd03:7257:ae71:6cb9:8e1d' var_dump((new Psr7GetClientIp())->forNaughtyList($request)); // '2013:b0a7:5d31:fd03::/64'