这两个方法 ip2long()inet_pton() 都是用于处理 IP 地址的函数,但是它们在处理的方式和支持的 IP 地址类型上有所不同。

  1. ip2long($ip)

    • ip2long() 是一个 PHP 内置函数,用于将 IPv4 地址(点分十进制表示)转换为对应的无符号长整型数值。
    • 它接受一个 IPv4 地址作为参数,并返回对应的无符号长整型数值。如果输入的 IP 地址格式不正确,则返回 false
    • 示例:

      $ip = '192.168.0.1';
      $ipNum = ip2long($ip);
      echo $ipNum;  // 输出:3232235521
  2. inet_pton($ip)

    • inet_pton() 是一个 PHP 内置函数,用于将 IPv4 或 IPv6 地址转换为对应的二进制表示。
    • 它接受一个 IP 地址作为参数,并返回一个包含二进制表示的字符串。如果输入的 IP 地址格式不正确,则返回 false
    • inet_pton() 可以处理 IPv4 和 IPv6 地址。
    • 示例:

      $ipv4 = '192.168.0.1';
      $ipv6 = '2001:0db8:85a3:0000:0000:8a2e:0370:7334';
      
      $ipv4Binary = inet_pton($ipv4);
      echo bin2hex($ipv4Binary);  // 输出:c0a80001
      
      $ipv6Binary = inet_pton($ipv6);
      echo bin2hex($ipv6Binary);  // 输出:20010db885a3000000008a2e03707334

需要注意的是,ip2long() 只能处理 IPv4 地址,而 inet_pton() 可以处理 IPv4 和 IPv6 地址。在使用这两个函数时,应根据需要选择适当的函数来处理对应的 IP 地址类型。

多层代理 获取真实IP 问题百度一搜 一堆. 但大多都是通过 X-Forwarded-For 获取真实IP
原理就是 负载 LVS /EOB /SLB 为了让下游正常获取 客户端IP 会将 客户端IP 填充到 X-Forwarded-For 中传递给下游服务

用户真实IP, 负载, 代理服务器1-IP代理服务器2-IP

我们原来获取真实IP 直接就 逗号炸开 取第一个IP

问题来了 客户端请求头 只需要添加 X-Forwarded-For 头信息 就可以伪造IP

解决方案:

  1. 根据自己服务代理层数决定 层数 != ip 数 就丢包
    /**
     * @desc 检测异常IP
     * @return string
     * @throws
     */
    public static function checkLimitIp()
    {
        $header_data = Http::getHeader();
        foreach (array('x-real-forwarded-for', 'x-forwarded-for', 'http_x_forwarded_for', 'x-real-ip', 'http_client_ip', 'remote_addr') as $v1) {
            if (isset($header_data[$v1])) {
                $ip_list = explode(',', $header_data[$v1]);
                // todo 注意 前端 slb + nginx IP
                $ip_num = count($ip_list);
                if ($ip_num > 2) {
                    throw new ErrorException(-114);
                }
            }
        }
    }
  1. 代理层除了第一层负载外 全部都是内网IP 所以只需要倒着数 找到最后一个外网IP 就可以定位到 负载IP , 负载IP 的前面就是真实客户端IP

真实深坑. 阿里云SLB 如果是覆盖 X-Forwarded-For , 不是 追加 X-Forwarded-For 就不会存在用户伪造问题. 也许阿里大佬有自己的想法吧 . 但在业务代码中 过滤真心麻烦....

这个文章放在云笔记里面半年多了, 出现问题场景是我们从 `迁移至 阿里云` 之后;
优化 api服务 发现有大量用户通过 X-Forwarded-For 仿造客户端IP 从而跨过我们后端对IP做的频率限制.

原理很简单 一般公司服务器都是 在服务最前端放 slb/lvs 这种负载均衡服务, 用户请求的IP 插入 X-Forwarded-For 前面

我们使用加速通道 多层的代理 ;

后端按照如下顺序获取客户端的真实IP

HTTP_ALI_CDN_REAL_IP;
HTTP_CF_CONNECTING_IP;
HTTP_X_CONNECTING_IP;
XXXX_Client_IP;
USER_REAL_IP; (通过nodejs 将用户的真实ip 透传给用户中心内网)

上述变量详解
HTTP_ALI_CDN_REAL_IP
链路配置了阿里云CDN,则阿里云CDN会传递此变量给后端,变量内的值就是客户端的真实IP地址。
HTTP_CF_CONNECTING_IP
如上,该值是cloudflare提供的客户端真实IP地址。
HTTP_X_CONNECTING_IP
如上,该值是加速乐提供的客户端真实IP地址。
XXXX_Client_IP
该值适用场景是SLB-->Nginx直连情况下,Nginx层启用了递归搜索。并且需要OP手动添加上层SLB的IP段为信任IP,通过判断X-Forwarded-For内最右侧的一个非信任IP值认定为客户端的真实IP地址并把此IP赋值给remote_addr,再由remote_addr赋值给XXXX_Client_IP。后端配置该配置前,请先跟OP确认上层是否配置。

XXXX_Client_IP 后端的应用服务(proxy_pass)赋值变量:

    location / {
        ... ...
        proxy_set_header XXXX_Client_IP $remote_addr;
        ... ...
    }

转发到后端的FastCGI服务(fastcgi_param)赋值变量:

    location ~ \.php$ {
        ... ...
        fastcgi_param   XXXX_Client_IP  $remote_addr;
        ... ...
    }

下面是客户端代理的IP 捕获文章 与 上文没有关系 ...

参考地址: https://www.cnblogs.com/rendd/p/6183094.html

1、没有代理服务器

  
HTTP_X_FORWARDED_FOR = 没数值或不显示 (X-Forwarded-For)
REMOTE_ADDR = 客户端IP

    $ip = $_SERVER['REMOTE_ADDR'];

2、透明代理

REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_X_FORWARDED_FOR = 客户端真实 IP (经过多个代理服务器时,这个值类似:221.5.252.160, 203.98.182.163, 203.129.72.215)

这类代理还会将客户真实ip发送到请求对象,无法隐藏真实ip
 

    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];

三、使用普通匿名代理服务器,

  REMOTE_ADDR = 最后一个代理服务器 IP
  HTTP_X_FORWARDED_FOR = 代理服务器 IP (经过多个代理服务器时,这个值类似:203.98.182.163, 203.98.182.163, 203.129.72.215)

  这样就隐藏了客户端的真实ip,但服务器会知道客户端是通过代理服务器去访问的。

四、使用欺骗性代理服务器,

  REMOTE_ADDR = 代理服务器 IP
  HTTP_X_FORWARDED_FOR = 随机的 IP(经过多个代理服务器时,这个值类似:220.4.251.159, 203.98.182.163, 203.129.72.215)

  服务器可以识别到时通过代理服务器访问的,但发送给目标服务器的是虚假ip。

五、使用高匿名代理,

  REMOTE_ADDR = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 没数值或不显示

  使用这种代理时,不同浏览器不同设备会返回不同的ip头信息,因此PHP使用$_SERVER["REMOTE_ADDR"]$_SERVER["HTTP_X_FORWARDED_FOR"] 获取的值可能是空值也可能是“unknown”值。

上面 五类IP获取方式 总结下 前2种都是可以真实获取客户端IP 后面 3种方式 基本服务端是抓瞎的. 主要介绍的是纯客户端的捕捉ip 方式

  • 第1 页/共1页

karp

创建我自己的巨人