文章总结: 本文详细介绍了PHP中获取客户端IP地址的方法,包括直接使用REMOTE_ADDR和在代理环境下使用HTTP_X_FORWARDED_FOR等头部信息,提供了获取真实IP的函数代码实现,分析了IP获取的可靠性问题并指出可能存在的伪造风险,同时给出了nginx配置建议以确保正确传递客户端IP信息。 综合评分: 81 文章分类: WEB安全,安全开发,代码审计,应用安全
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的可靠性》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论