news 2026/9/26 21:38:41

PHP 获取客户端真实IP地址

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PHP 获取客户端真实IP地址

PHP获取客户端真实IP地址,需要根据具体的服务器环境来确定使用哪种方法。目前搜索到的方法,大多是直接贴代码,没有针对不同情况作出说明,有可能导致系统被假IP骗过(IP欺骗)。

很多文章都提到“无法保证获取到的访客IP地址100%准确”,是否意味着PHP获取访客IP一定有漏洞可钻呢?

只要根据实际部署情况选择相对应的代码获取访客IP地址,是可以确保程序不被假IP欺骗的。

PHP的运行方式

PHP支持非常多的运行方式,例如php-cgi、php-fpm、swoole、php-cli、php-mod等。其中,php-fpm是php的fast-cgi的进程管理器。php-mod通常配合Apache使用,而php-fpm通常配合Nginx使用。从PHP5.4开始,PHP甚至可以以内置PHP服务(Buid-in web server)方式运行。逐渐的,PHP形成了很多经典搭配,例如LAMP、LNMP、LNMPA、IIS+PHP。

无论采用哪种PHP运行方式,分清是谁传递IP给PHP程序即可。这里对几种常见环境进行分析。

无代理层(PHP内置服务器/swoole)

由于客户端IP数据是从TCP/IP协议层传递过来的,因此在没有中间代理(客户端和服务器直连)的情况下,可以直接通过标准方法REMOTE_ADDR获得与PHP直接通讯的IP地址。

例如$_SERVER['REMOTE_ADDR']或getenv("REMOTE_ADDR")。

而在swoole中,可以通过$request->server['remote_addr']获得客户端IP地址。

在这种情况下,REMOTE_ADDR不可以显式的伪造,获取到的是实际与服务器连接的IP地址,是可靠的。

Nginx代理(Nginx + php-fpm / Nginx + swoole)

常见的LNMP方案,属于Nginx反向代理。Nginx与php的通讯,无论unix socket方式还是tcp socket方式,都跟Nginx的Header配置有关系。

1

2

3

4

5

6

7

proxy_http_version 1.1;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header Host $http_host;

proxy_set_header X-NginX-Proxy true;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection "upgrade";

可以在第一层nginx代理设置proxy_set_header X-Forwarded-For $remote_addr,

其他层nginx代理设置proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for

这样就可以通过X-Forwarded-For获取客户端真实IP地址。

如果设置了X-Real-IP $remote_addr,则通过X-Real-IP获取客户端IP地址。

PHP代码:

1

2

3

4

5

// php-fpm等

$_SERVER['HTTP_X_FORWARDED_FOR']);

// swoole

$this->http_input->header('x-real-ip');

总结来说,当有Nginx代理的情况下,需要根据具体配置来选择获取的Header,从而正确获取客户端IP地址,此时PHP中的的REMOTE_ADDR可能是最后一级代理的IP地址。

Apache代理(Apache + php_mod / Apache + php-fpm)

通常在Apache + PHP方案中,获取IP地址取决于Apache配置信息。

绝大部分情况可以使用$_SERVER["REMOTE_ADDR"]获取到真实客户端IP地址。

如果Apache上级存在Nginx,那么可以在Apache中使用mod_rpaf模块将客户端IP地址传递到X-Forwarded-For头中。

1

PAFheader X-Forwarded-For

负载均衡/云虚拟机/Serverless

在负载均衡条件下,需要查阅对应负载均衡程序的文档,来决定使用哪种方法获取真实客户端IP地址。

在大部分虚拟主机、负载均衡及无服务器中,可以通过HTTP_CLIENT_IP、HTTP_X_FORWARDED_FOR或X-REAL-IP其一得知客户端IP地址。但是不建议对多种来源进行空值判断,这样容易被伪造者利用,从而实现IP欺骗。

目前并未有标准规定将客户端IP地址放入名为CLIENT_IP的环境变量,但是有不少老虚拟主机供应商这样做。新的提供商都不再使用该环境变量。网上大量的PHP文章中都是优先获取HTTP_CLIENT_IP的值,因此导致网上存在大量的服务器可以被伪造IP欺骗。

可能有该漏洞的代码:

1

2

3

4

5

6

<?php

if(!empty($_SERVER['HTTP_CLIENT_IP'])) {

$ip=$_SERVER['HTTP_CLIENT_IP'];

}elseif(isset($_SERVER['REMOTE_ADDR']) &&$_SERVER['REMOTE_ADDR'] &&strcasecmp($_SERVER['REMOTE_ADDR'],'unknown')) {

$ip=$_SERVER['REMOTE_ADDR'];

}

IIS + PHP

这种情况下直接使用$_SERVER['REMOTE_ADDR']方法即可。

总结

无论是哪种情况,如果用户使用匿名代理访问服务器,只能获取到代理服务器的IP地址,其IP地址仍然具有参考意义。

获取客户端真实IP地址,此事需要查阅相关资料根据具体情况选用某一个方法,而不是复制粘贴。

部分方法获取到的值可能是一个数组。

不建议对获取到的IP地址进行正则过滤,有可能你获取到的是一个IPv6地址。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/26 21:37:05

游戏AI背后的强化学习本质:从像素到策略的工程解法

1. 这不是“教AI打游戏”&#xff0c;而是重建智能体的决策本能你点开这个标题&#xff0c;大概率是被“AI打游戏”这个画面吸引来的——比如AlphaGo下围棋、OpenAI Five打DOTA、DeepMind的Agent在《星际争霸2》里指挥千军万马。但我要先泼一盆冷水&#xff1a;真正让AI“学会打…

作者头像 李华
网站建设 2026/9/26 21:36:49

CMS拖拽生成页面实战:物料协议、拖拽引擎与属性面板全链路解析

简介&#xff1a;这是一份面向前端初学者与CMS开发者的拖拽建站示例资源&#xff0c;围绕“从左侧组件库拖拽、右侧画布自由排版”的核心流程&#xff0c;演示如何用拖拽克隆方式快速生成页面。资源共9个文件&#xff0c;以5个JavaScript脚本和3个CSS样式表为主&#xff0c;搭配…

作者头像 李华
网站建设 2026/9/26 21:36:07

Windows 11移动热点无法开启的三大底层原因与实操修复

1. 这不是系统故障&#xff0c;而是Windows 11移动热点的“身份识别”问题你点开设置 → 网络和Internet → 移动热点&#xff0c;开关一开就弹出“我们无法设置移动热点”&#xff0c;提示框灰底白字&#xff0c;像一道冷冰冰的电子门禁。这不是蓝屏、不是死机、不是驱动崩溃—…

作者头像 李华
网站建设 2026/9/26 21:35:38

AgentScope 2.0实战:多智能体编排、RAG服务化与Java企业级接入

最近在折腾多智能体编排的时候&#xff0c;被朋友拉去看了下 AgentScope 的新版本&#xff0c;越用越觉得这个系统值得单独写一篇来推荐。如果你正在做基于大模型的多 Agent 应用&#xff0c;或者企业里想把 RAG、工具调用、多角色协作这些能力串成一条稳定链路&#xff0c;Age…

作者头像 李华
网站建设 2026/9/26 21:33:50

Qt+SQL试题库管理系统:自动组卷与数据库设计实战

简介&#xff1a;这份资源是一套基于Qt与SQL实现的试题库管理系统课程设计完整资料&#xff0c;面向计算机相关专业学生及需要完成数据库课程设计、C编程实训的学习者&#xff0c;帮助解决从需求分析到系统落地的全流程问题。压缩包共47个文件&#xff0c;约1.29MB&#xff0c;…

作者头像 李华