ThinkPHP6实现IP白名单需入口层(Nginx/SLB)源头净化与应用层(TP6)可信代理校验+业务过滤双控:先配置trusted_proxies声明可信内网段,再在Nginx中强制覆盖X-Forwarded-For并启用realip模块,最后通过中间件调用$request->ip()校验白名单,支持IPv4/IPv6全等匹配。

ThinkPHP6 添加 IP 白名单授权,核心是两层控制:**入口层(Nginx/SLB)源头净化 + 应用层(TP6)可信代理校验与业务过滤**。只做其中一层,容易被绕过。
一、配置可信代理段(关键前提)
TP6 的 request()->ip() 默认只信任 127.0.0.1 和 ::1。线上有 Nginx、CDN 或 SLB 时,必须显式声明“谁是最后一跳可信代理”,否则取到的 IP 就是网关地址(如 10.0.0.1),不是真实用户 IP。
- 在
config/app.php中设置:'trusted_proxies' => ['10.123.0.0/16', '172.16.0.0/12'](填你实际的内网代理段,比如阿里云 SLB 后 ECS 所见的$remote_addr) - 切勿填公网 IP、域名或 CDN 标识(如
cf-ray),这些无效 - 留空或填错,会导致所有请求 fallback 到
$_SERVER['REMOTE_ADDR'],IP 全变成内网统一地址
二、Nginx 层必须做源头清洗
TP6 的白名单只校验“头是谁发的”,不校验“头里内容是否干净”。如果 Nginx 允许客户端随意传 X-Forwarded-For,攻击者直接伪造就绕过了。
- 对外 Nginx(直连用户或 Cloudflare):
proxy_set_header X-Forwarded-For $remote_addr;(强制覆盖,丢弃用户传来的 XFF) - 内网中间层(如 Nginx → PHP-FPM):
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;(安全拼接,保留链路) - 启用 Nginx
realip模块:set_real_ip_from 10.123.0.0/16;real_ip_header X-Forwarded-For;real_ip_recursive on; - 禁用
proxy_set_header X-Real-IP $remote_addr同时又透传原始 XFF——这等于开了两个后门
三、业务层实现 IP 白名单过滤(中间件方式)
在 .env 中定义白名单:
立即学习“PHP免费学习笔记(深入)”;
FILTER_IP = 192.168.1.100, 203.208.60.1, 2001:db8::1新建中间件(如 app/middleware/IpWhitelist.php):
- 调用
$request->ip()获取经校验的真实 IP(非$_SERVER数组直读) - 用
filter_var($ip, FILTER_VALIDATE_IP)做基础格式校验 - 将白名单字符串
explode(',', env('FILTER_IP'))拆成数组,逐个比对(支持 IPv4/IPv6) - 匹配失败时返回 JSON 错误,例如:
return json(['code' => 403, 'msg' => 'Forbidden: IP not allowed']); - 注意:不要用
strpos做子串匹配(如192.168.1匹配192.168.100会误判),应使用全等比较或 CIDR 判断
四、特殊场景补充说明
- 微信接口调用:需把你的服务器公网 IP 加入微信后台的「IP 白名单」,否则
access_token等接口会拒绝请求 - ThinkAPI 服务:在个人后台「API 管理 → IP 白名单」中单独配置,与项目代码无关
- 开发环境调试:可临时在中间件中放行
127.0.0.1或本地网段,但上线前务必移除或收紧 - 日志记录建议脱敏公网 IP(如
123.123.xxx.xxx),避免敏感信息泄露



















