PHP获取IP的可靠性

admin 2025-12-22 03:59:25 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细介绍了PHP中获取客户端IP地址的方法,包括直接使用REMOTE_ADDR和在代理环境下使用HTTP_X_FORWARDED_FOR等头部信息,提供了获取真实IP的函数代码实现,分析了IP获取的可靠性问题并指出可能存在的伪造风险,同时给出了nginx配置建议以确保正确传递客户端IP信息。 综合评分: 81 文章分类: WEB安全,安全开发,代码审计,应用安全


cover_image

PHP获取IP的可靠性

原创

信安路漫漫

信安路漫漫

2025年12月17日 07:02 上海

在PHP中,获取客户端IP地址通常可以通过$_SERVER超全局变量来实现。这个变量包含了诸如服务器和执行环境的信息,其中包括客户端的IP地址。

1)使用$_SERVER[‘REMOTE_ADDR’]

当不存在代理和负载均衡时,可以使用这种方式

$clientIp = $_SERVER['REMOTE_ADDR'];echo "客户端IP地址: " . $clientIp;

2)存在代理和负载均衡

当客户端通过代理服务器或负载均衡器连接到你的服务器时,直接使用$_SERVER[‘REMOTE_ADDR’]可能不会返回正确的客户端IP地址。在这种情况下,你可以尝试使用HTTP_X_FORWARDED_FOR头部信息,它通常包含了原始请求者的IP地址。如下所示

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

HTTP_X_FORWARDED_FOR可能包含多个IP地址(例如,通过多个代理),它们之间用逗号分隔。在这种情况下,你可能需要提取第一个IP地址。

$forwardedIps = explode(',', $headers['X-Forwarded-For']);$clientIp = trim($forwardedIps[0]); // 获取第一个IP地址echo "客户端IP地址: " . $clientIp;

3)其它的头部信息,如HTTP_CLIENT_IP,HTTP_X_REAL_IP

#

获取客户端IP的代码

此方法优先使用 HTTP_CLIENT_IP,若无效则尝试 HTTP_X_FORWARDED_FOR,最后回退到 REMOTE_ADDR

function getClientIp() {    $ip = $_SERVER['HTTP_CLIENT_IP'] ?? $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'];    // 处理多级代理时,HTTP_X_FORWARDED_FOR 可能包含多个 IP,取第一个有效值    if (strpos($ip, ',') !== false) {        $ips = explode(',', $ip);        $ip = trim($ips[0]);    }    return $ip;}

可靠性分析

从上面可以看出,通过REMOTE_ADDR获取的可能是代理的IP,而非真正的客户端IP。要获取真实的客户端IP需要多种字段进行验证。

同时如果配置不当,可能也导致伪造相应的消息头,让服务端获取错误的IP地址。

nginx的配置添加相应消息头

为了让服务器能得到客户端的ip,可以在nginx中做些赋值操作:

1.proxy_set_header  X-real-ip $remote_addr;

即在请求头部放入真实ip

2.proxy_set_header  X-Forwarded-For $proxy_add_x_forward-for;

这一段的意思是: 添加一个$proxy_add_x_forward-for到X-Forwarded-For

设置X-Forwarded-For后,每次经过代理转发都会有记录,格式是: client,proxy1,proxy2,这是一个非rfc标准,因此默认没有,需要手动添加,


查看原文:《PHP获取IP的可靠性》

评论:0   参与:  3