源码系统概览
文章正文
这是一款 WordPress 安全插件源码,插件名叫腾飞盾,作用是拦截测速站点和脚本类请求,不让它们正常抓到页面。
核心防火墙不走普通插件流程,而是被复制到 mu-plugins 目录,在 WordPress 启动早期就完成判断。
后台带独立设置页,规则开关、白名单、拦截方式和拦截日志都能在同一个面板里管理。
源码简介
这套源码属于 WordPress 站点防护类项目,主要围绕 User-Agent 识别、Referer 匹配、请求头判断和拦截日志展开。
插件主文件 shiguang-shield.php 负责注册激活钩子、建日志表和部署 MU 文件,includes 目录下的 class-sgs-core.php 保存规则库,class-sgs-admin.php 负责后台界面与 AJAX 保存。
规则库里预置了 ITDOG、站长之家、17ce、波测这几类测速工具,以及 curl、Wget、python-requests、Go-http-client、okhttp、axios 等命令行与脚本客户端特征。
保存设置时插件会把配置写成 wp-content/mu-plugins/sgs-config.php,前置防火墙读这个文件执行判断,整个拦截流程不查数据库。
拦截记录写入自建的 sgs_logs 数据表,后台日志页分页展示,并带每日定时清理任务。
适用场景
- 学习 WordPress mu-plugins 前置加载机制与轻量防火墙的写法
- 研究基于 User-Agent、Referer 和请求头做客户端识别的规则组织方式
- 在自有测试站点上做访问拦截、日志记录与后台设置面板的代码参考
功能亮点
- 核心防火墙文件 firewall/0-sgs-firewall.php 会在激活时复制到 wp-content/mu-plugins,插件停用时自动删除,代码里还带文件大小比对的热更新检查
- class-sgs-core.php 中的规则库按 itdog、chinaz、17ce、boce、curl、wget、python、go、java、node 等键位组织,每条规则含名称与关键词数组
- 后台设置页分控制台、规则库、白名单、拦截日志四个标签,规则开关、拦截状态码、自定义回击 Header 与日志保留条数都能配置
- 拦截方式提供 400/403/404/500/502/503 等标准状态码,也提供 418、429、随机状态码、返回空内容以及 Gzip 消耗和延时响应等处置选项
- 白名单支持按 IP 列表放行和按 URL 密钥放行,已登录用户通过 wordpress_logged_in_ 这个 Cookie 判断直接跳过
- 拦截时调用 fastcgi_finish_request 先断开连接再写日志,日志表 sgs_logs 记录时间、IP、URL、UA、命中规则和处置方式
技术架构与部署指南
| 维度 | 本套源码 | 同类通用方案 |
|---|---|---|
| 技术栈 | 前端:后台面板使用原生 HTML 与 CSS,配套 assets/style.css 和依赖 jQuery 的 asse | 依具体方案选型,需自行搭建与维护 |
| 部署方式 | 1. 把 tengfei-shield 目录上传到 wp-content/plugins,压缩包里带的 __MACOSX | 多托管于第三方平台或订阅云服务 |
| 功能侧重 | 核心防火墙文件 firewall/0-sgs-firewall.php 会在激活时复制到 wp-content/mu-p | 功能通用,定制深度有限 |
| 数据归属 | 数据自持,部署在自有服务器,不出站 | 数据通常留存于服务商侧 |
| 成本模式 | 获取后自主部署,无持续授权费用 | 通常按订阅或调用量计费 |
技术栈与运行环境
前端:后台面板使用原生 HTML 与 CSS,配套 assets/style.css 和依赖 jQuery 的 assets/script.js 处理标签切换与保存提示。
后端:PHP 编写的 WordPress 插件,使用 wpdb、dbDelta、add_options_page、wp_ajax 等 WordPress 原生接口。
数据库:MySQL,激活时通过 dbDelta 创建带表前缀的 sgs_logs 日志表。
运行环境:需要能写入 wp-content/mu-plugins 目录;瞬时断连功能依赖 PHP-FPM 环境下的 fastcgi_finish_request,Apache mod_php 下会退化为普通输出。
安装与部署提示
1. 把 tengfei-shield 目录上传到 wp-content/plugins,压缩包里带的 __MACOSX 目录属于打包残留,可以直接删掉。
2. 在后台插件列表启用后,插件会自动建日志表并把防火墙文件写入 mu-plugins,若 mu-plugins 目录没有写权限需要先手动创建并放开权限。
3. 进入设置菜单下的腾飞盾防火墙页面,先在规则库里勾选需要拦截的类型,再点保存并生成配置,配置文件生成后拦截才会真正生效。
4. 上线前建议先把自己的出口 IP 加进白名单,或设置一个 URL 密钥,避免规则配错时把自己也挡在外面。
截图与演示说明
下面这张图是插件后台设置页的完整截图,来自演示环境,能看清面板的整体布局。

图中顶部显示今日拦截数量与防火墙运行状态,对应 class-sgs-admin.php 里 render_page 方法读取的统计缓存。
左侧标签依次是控制台、规则库、白名单、拦截日志与关于页,控制台里能看到全局开关与拦截状态码下拉框。
如果还要补图,部署后可以再抓规则库标签的开关列表、白名单填写页,以及产生拦截记录后的日志表格分页效果。
常见问题
问:启用插件后为什么没有任何拦截效果?
答:防火墙读的是 wp-content/mu-plugins/sgs-config.php,这个文件要在后台点过保存并生成配置之后才会写出来。
答:另外代码里判断,拦截模式为 none 且战争模式未开启时会直接返回,需要至少开启其中一项。
问:会不会误伤正常访问或者搜索引擎?
答:规则里对 curl、Wget、python-requests、axios 这类特征做匹配,接口调用和监控探测容易被一起挡掉。
答:代码中还有一条指纹判断,UA 自称 Chrome 90 以上但缺少 Client Hints 请求头就会被拦,部分代理转发或隐私浏览器可能因此被误判,上线前建议先用白名单观察一段时间。
安全风险提示
本源码在代码审阅中发现几处需要处理的问题,部署前务必注意:
路径:firewall/0-sgs-firewall.php 日志写入部分
类型:SQL 拼接未过滤
证据:写日志的 INSERT 语句里 IP、UA、规则字段做了转义,但请求 URI 变量直接拼进 SQL 且未做处理
建议:改用 wpdb 的 prepare 或 insert 方法重写这条语句后再上线
路径:includes/class-sgs-admin.php 的保存与清空日志接口
类型:缺少 nonce 校验
证据:两个 AJAX 接口只判断了当前用户权限,没有校验 nonce,日志表格输出的规则字段也未做转义
建议:补上 nonce 校验并对输出字段转义,清空日志用的 TRUNCATE 操作建议加二次确认
特别提示:本源码未检测安全风险文件,下载后请务必进行安全审计,删除恶意代码后再部署使用!
下载说明
源码仅供学习研究、测试部署和二次开发参考,商用前请自行确认授权、版权和安全风险。
本插件涉及访问拦截与访客日志记录,日志中会保存 IP 与 User-Agent,上线前请遵守个人信息保护相关规定并在隐私说明中告知。
插件内置的流量消耗与延时响应属于对抗性处置手段,请只在自有站点的可控范围内使用,避免误伤搜索引擎抓取或正常监控而影响站点收录。