thinkphp 本身不内置 ip 黑名单功能,但可通过 nginx include 动态加载黑名单配置实现高效封禁;php 控制器负责写规则并重载 nginx,配合 ua/referer 校验、行为限流等形成多层防护。

ThinkPHP 本身不内置 IP 黑名单功能,但可以结合 Nginx 配置 + PHP 动态管理实现高效、可维护的 IP 封禁,尤其适合应对 OpenAI 等高频非法爬虫(千万级请求)。关键不是写死在 PHP 里,而是让 Nginx 承担拦截,PHP 只负责“写规则”。
用 Nginx include 实现动态 IP 黑名单
这是最推荐的方式:把黑名单规则交给 Nginx 执行,性能高、生效快、不影响 ThinkPHP 主逻辑。
- 在宝塔面板中打开你的 ThinkPHP 站点配置文件(【网站】→ 点击站点 → 【配置文件】)
- 在
server { }块内、所有location规则之前,添加一行:include /www/wwwroot/你的站点目录/ip_blacklist.conf; - 确保路径准确且 Nginx 有读取权限(如
/www/wwwroot/mysite.com/ip_blacklist.conf) - 保存后无需重启 Nginx,但首次启用需重载(宝塔会提示或手动点【重载配置】)
用 ThinkPHP 控制器自动追加封禁规则
不需要每次手动改配置,写个简单控制器就能通过代码封 IP,还能集成到日志分析或风控流程中。
- 新建控制器,例如
app/controller/Security.php - 在方法里调用
file_put_contents($path, "deny 192.0.2.45;\n", FILE_APPEND | LOCK_EX)写入规则 - 写完必须执行
shell_exec('nginx -s reload 2>&1')或调用宝塔 API 重载配置(生产环境建议用宝塔 API 更安全) - 可配合行为日志:当某 IP 1 分钟内触发 50+ 次无 Cookie、无 Referer 的 /api/* 请求,自动调用该方法封禁
补充:别只靠 IP 黑名单
单一 IP 封禁容易被代理池绕过,需叠加其他手段形成防护网:
-
UA + 行为双校验:中间件中检查
request()->header('user-agent')是否含python-requests、curl、bot,同时验证是否存在有效 session 或 JS 注入的时间戳字段(如_ts) -
Referer + X-Requested-With:API 接口强制要求
Referer来自自己域名,且X-Requested-With: XMLHttpRequest,爬虫脚本常忽略这两个头 -
限流兜底:用 ThinkPHP 的
throttle中间件限制单 IP 每分钟最多 30 次访问核心接口,超限直接返回 429
宝塔面板快捷方式(适合临时应急)
如果不想动配置,宝塔提供开箱即用的 IP 黑名单入口:
- 进入站点管理页 → 左侧【安全】→ 【访问控制】→ 【IP黑名单】
- 逐行输入 IP 或 CIDR 段(如
203.0.113.0/24),点击【保存】 - 规则实时写入 Nginx,对当前站点生效,不影响其他网站
- 注意:该方式不支持自动更新,适合手动封几个已知恶意 IP
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











