反向代理必须正确配置x-forwarded-for和x-real-ip头,php中不可直接用$_server['remote_addr']获取真实ip,需优先信任http_x_real_ip等可信头并过滤私有网段,同时严格限制cdn回源ip、禁用敏感信息输出。

反向代理必须加 X-Forwarded-For 和 X-Real-IP 头
直接暴露 Nginx/Apache 的 IP,本质是没走反向代理或代理头被清空。PHP 里用 $_SERVER['REMOTE_ADDR'] 拿到的永远是上一跳地址——如果没配好代理,那就是攻击者直连的服务器 IP。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- Nginx 配置中必须显式设置:
proxy_set_header X-Real-IP $remote_addr;和proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - Apache 用
mod_remoteip替代默认日志模块,并在虚拟主机里配置RemoteIPHeader X-Forwarded-For - Cloudflare 等 CDN 后,务必开启“IP Geolocation”并确认其真实 IP 头是
CF-Connecting-IP,不是所有 CDN 都用标准头
PHP 中获取客户端真实 IP 不能只读 $_SERVER['REMOTE_ADDR']</H3>
<p>这个变量永远返回 TCP 连接发起方地址,对反向代理/CDN 场景完全不可信。硬编码读它,等于主动把服务器 IP 塞给前端或日志系统。</p>
<p>实操建议:</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/7fc7563c4182" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">PHP免费学习笔记(深入)</a>”;</p>
<ul>
<li>优先信任 <code>$_SERVER['HTTP_X_REAL_IP']
(Nginx 传入)、$_SERVER['HTTP_X_FORWARDED_FOR'](多级代理时逗号分隔,取第一个非私有地址)、$_SERVER['HTTP_CF_CONNECTING_IP'](Cloudflare)
127.0.0.0/8、10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、::1、fd00::/8
X-Forwarded-For 提取 IP:它可能被客户端伪造,仅限内部可信链路使用日志和调试输出里泄露 $_SERVER['SERVER_ADDR'] 是高危行为
很多 PHP 框架或自定义错误页会把 $_SERVER['SERVER_ADDR'] 或 gethostbyname(gethostname()) 打进 HTML 注释、JSON 错误响应、甚至 500 页面源码里——这是最隐蔽也最常被忽略的 IP 泄露点。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 禁用 PHP 的
expose_php = On(php.ini),防止 HTTP 响应头泄露版本,间接增加指纹识别成功率 - 检查所有
error_log()、var_dump()、print_r($_SERVER)调用,删掉或替换掉含SERVER_ADDR、LOCAL_ADDR、HOSTNAME的字段 - 上线前跑一次
grep -r "SERVER_ADDR\|gethostbyname\|php_uname" ./app/,重点扫控制器、中间件、异常处理器
CDN 回源未限制 IP 段会导致真实 IP 被暴力探测
哪怕你配置了反向代理,只要 CDN 回源地址没做白名单,攻击者就能伪造 Host 头直连你的源站端口,绕过所有前置防护,$_SERVER['REMOTE_ADDR'] 就是他们的真实出口 IP,而你的源站 IP 已经暴露在 DNS 或历史 SSL 证书里。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- Nginx 回源配置里加
allow+deny all,只放行 CDN 官方公布的 IP 段(如 Cloudflare 的 https://www.php.cn/link/2043d2a8fa2208b4c5f19bc6d5a94320) - 云服务器安全组/防火墙层面封死 80/443 端口对外访问,只允许 CDN IP 段入站
- 不要用二级域名指向源站做“备用回源”,这种域名极易被子域名爆破或证书透明度日志查到
真实 IP 隐藏不是单点配置,是代理链、代码层、日志层、网络层四者必须同时对齐。最容易被漏掉的是调试输出和 CDN 白名单——它们不报错,但会让前面所有努力归零。











