slam/psr7-get-client-ip

从ServerRequestInterface获取客户端IP

v1.1.0 2023-11-23 06:44 UTC

This package is auto-updated.

Last update: 2024-09-19 17:11:00 UTC


README

Latest Stable Version Downloads CI Infection MSI

安装

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'