$_SERVER['REMOTE_ADDR']不可靠,因其仅反映TCP连接来源(如Nginx内网IP);真实IP需从X-Real-IP或X-Forwarded-For中提取,并严格校验可信代理白名单后取最左非代理IP。

PHP 接口无法直接信任 $_SERVER['REMOTE_ADDR'] 作为真实客户端 IP——尤其在有反向代理(Nginx、CDN、SLB)时,它通常只返回上一跳服务器的内网地址。
为什么 $_SERVER['REMOTE_ADDR'] 不可靠
该值由 PHP SAPI 层(如 FPM)根据 TCP 连接来源填充,不解析 HTTP 头。一旦请求经过 Nginx 或 CDN,$_SERVER['REMOTE_ADDR'] 就变成 Nginx 所在机器的 IP(比如 127.0.0.1 或 10.x.x.x),而非用户真实出口 IP。
真实 IP 通常藏在 X-Forwarded-For、X-Real-IP 等 HTTP 请求头中,但这些头可被客户端伪造,必须结合可信代理白名单校验。
如何安全获取真实客户端 IP
核心原则:只信任来自已知可信代理的转发头,并且只取链路中最左边的、不在代理列表里的 IP。
立即学习“PHP免费学习笔记(深入)”;
- 明确配置可信代理 IP 段(如 Nginx 本机、公司 SLB 内网段),避免无条件信任
X-Forwarded-For - 优先使用
X-Real-IP(Nginx 默认用set_real_ip_from+real_ip_header X-Real-IP设置,更可控) - 若用
X-Forwarded-For,需按逗号分隔、逆序遍历,跳过所有可信代理 IP,取第一个非代理 IP - 始终 fallback 到
$_SERVER['REMOTE_ADDR'](仅当无可信头或全部头不可信时)
示例逻辑:
$trustedProxies = ['127.0.0.1', '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16'];
$clientIp = $_SERVER['REMOTE_ADDR'];
if (!empty($_SERVER['HTTP_X_REAL_IP'])) {
$ip = $_SERVER['HTTP_X_REAL_IP'];
if (filter_var($ip, FILTER_VALIDATE_IP) && !in_array($ip, $trustedProxies) && !ip_in_ranges($ip, $trustedProxies)) {
$clientIp = $ip;
}
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = array_map('trim', explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']));
foreach (array_reverse($ips) as $ip) {
if (filter_var($ip, FILTER_VALIDATE_IP) && !in_array($ip, $trustedProxies) && !ip_in_ranges($ip, $trustedProxies)) {
$clientIp = $ip;
break;
}
}
}
常见错误与绕过风险
直接 $_SERVER['HTTP_X_FORWARDED_FOR'] 取第一个 IP?攻击者发 X-Forwarded-For: 1.2.3.4, 127.0.0.1 就能伪造;未校验代理白名单?公网任意请求都能带 X-Real-IP 头覆盖真实来源。
- 忽略 CIDR 范围匹配(如
10.0.0.0/8),只做字符串比对 → 代理段漏判 - 把
$_SERVER['HTTP_X_FORWARDED_FOR']当数组直接explode但未trim→ 空格导致filter_var失败 - Nginx 未配
set_real_ip_from却依赖X-Real-IP→ 该头根本不会被信任写入 - 将 IP 直接入库或打日志前未脱敏 → 泄露用户隐私,违反合规要求
额外注意事项
Cloudflare、阿里云 CDN 等会改写原始头,可能提供 CF-Connecting-IP 或 X-Forwarded-For(已清洗)。务必查阅对应服务商文档,确认其注入头是否默认可信,并将其加入 $trustedProxies 判断逻辑或单独处理。
不要在开发环境硬编码代理列表,应从配置中心或环境变量加载;IP 字段存储建议用 VARBINARY(16)(兼容 IPv6)而非 VARCHAR(45);输出到前端时记得匿名化(如 192.168.1.123 → 192.168.1.xxx)。











