简介:梦幻防红cos系统带后台版是一套面向网站管理员的防红工具,用于应对恶意流量攻击等造成的站点访问异常,支持后台自定义防红接口,无需精通底层技术即可配置防护策略,源码无加密,便于二次开发。压缩包共82个文件、624KB,包含64个PNG图片、8个CSS样式、7个PHP程序文件,以及JS、JPG和TXT安装说明,其中PHP文件负责后台逻辑与接口调用,CSS与JS构建管理界面,图片和JPG用于界面元素与提示。解压后在PHP7.0环境下运行install.php即可安装,若安装异常,切换PHP版本即可解决,后台入口为域名后加admin.php。目前已有111人学习使用,这套资料适合个人站长、运维新手和防红机制学习者,既能直接部署到线上站点,也可通过现有代码理解防红接口的调用与配置流程,为网站稳定运行提供低成本防护方案。
1. 防红系统到底是什么:从网站被刷到后台自定义接口
防红系统在站长圈里指的是“网站突然被大量异常请求打红、CPU 和带宽被耗尽”之后的拦截与分流机制。常见现象是页面打开变慢、数据库连接数爆炸、甚至服务器直接被停机。这类系统就是把“请求验证”从业务代码里抽出来,做成一个可以独立配置的入口。梦幻防红 cos 系统 3.5 带后台版,最核心的价值是后台可以自定义防红接口,不必为了换一个防护服务去翻源码、改逻辑、重新部署。它是一套纯 PHP 项目,要求 PHP 7.0 环境,解压后跑一遍 install.php 就能安装,管理员后台入口是域名加 admin.php。适合手里有虚拟主机或轻量云服务器、不想碰复杂网关又想给网站加一道验证的运营者。
2. 解压到上线:PHP 7.0 环境与一键安装脚本的完整流程
2.1 先认清文件结构:四个关键文件决定你能不能跑起来
把压缩包解开之后,根目录下的文件不算多,但每个都有自己的职责。我先列一个简化后的文件视图,方便你不知道该从哪里下手时对照:
梦幻防红cos系统3.5带后台版/ ├── install.php # 安装脚本,负责建表与初始化配置 ├── config.php # 全局配置,防红接口、密钥、超时等 ├── db_config.php # 数据库连接信息 ├── admin.php # 后台入口,域名+admin.php 访问 ├── index.php # 前台入口,请求进来先走这里的验证逻辑 ├── download.php # 文件下载通道的防红校验 ├── logout.php # 退出后台登录 ├── assets/ # 公共资源目录 ├── css/ # 全套样式文件 │ ├── oneui.css # 后台框架通用样式 │ ├── main.css # 主样式 │ ├── plugins.css # 插件样式 │ ├── mh.css │ ├── mh1.css # 防红业务页面样式 │ └── mh2.css ├── img/ ├── js/ └── 安装说明.txt对新手来说,最该先搞懂的是 config.php 和 db_config.php 的分工。db_config.php 只管“怎么连数据库”,里面一般放着主机地址、端口、库名、用户名、密码;config.php 管的是“业务怎么跑”,包括防红接口地址、密钥、超时时间、是否写日志。这两份文件分开有个好处:换数据库只需要改一处,升级防红配置又不会碰连接信息。admin.php 是后台的入口,install.php 是安装器,这两者在部署期间一个都不能丢。
要注意的是,这套系统标的是无加密源码,意味着你直接用编辑器打开 config.php 和 index.php 就能看到全部逻辑,不存在 Zend 加密或 eval 混淆。对想长期维护的人来说,这比黑匣子式的加密版强太多——出了问题自己能定位,不想用某个功能也能直接注释掉。
2.2 部署步骤:从解压到域名+admin.php 进入后台
部署本身不复杂,最耗时的往往是对环境要求不熟悉。整套系统要求 PHP 7.0,我对这个版本要求比较敏感:大多数面板默认会给新站点配 PHP 7.4 或 8.0,如果直接装这套系统,可能出现函数调用失败或者安装页空白。第一步先把站点 PHP 版本切到 7.0,再继续。常见的主机管理面板里,在站点设置或PHP版本管理里切换即可,本地调试则用集成环境新建一个 7.0 的站点。
我习惯的完整步骤如下:
- 在主机面板里新建站点,绑定一个域名,创建空数据库,记下数据库名、用户名、密码。
- 把压缩包解压上传到站点根目录。压缩包里的目录层级比较浅,解压后应该能直接看到 install.php,而不是嵌套一层同名文件夹。
- 访问 http(s)://你的域名/install.php,进入安装界面。
- 按提示填入数据库信息和管理员初始账号。安装成功后,页面会提示你删除或改名 install.php。
- 访问 http(s)://你的域名/admin.php,用刚才设置的管理员账号登录后台。
- 在后台找到防红接口配置,填入你准备使用的接口地址和密钥,保存。
第 4 步是很多新手最容易省略的。install.php 不删,相当于把安装器长期暴露在外面,别人重放安装请求就可能把你的配置重置掉。系统自带说明里也会强调这一点,但我仍然建议把 install.php 改成 install_off.php 或者直接删除。
上传和权限设置可以用命令操作,也可以直接在面板的文件管理器里做。用命令的话,注意用户组要跟 PHP 运行用户一致,否则后续安装写配置文件时会被系统拒绝。常见做法是这样:
# 解压到站点根目录,注意目录名要对应你的站点路径 unzip 梦幻防红cos系统3.5带后台版.zip -d /www/wwwroot/你的站点目录 # 确保文件和目录归属 PHP 运行用户,通常用 www chown -R www:www /www/wwwroot/你的站点目录 # 目录给 755,文件给 644 就够了 find /www/wwwroot/你的站点目录 -type d -exec chmod 755 {} \; find /www/wwwroot/你的站点目录 -type f -exec chmod 644 {} \; # 如果安装时提示不可写,再单独给 config.php 和 db_config.php 加写权限 chmod 664 /www/wwwroot/你的站点目录/config.phpchown -R www:www 这一句在部署里非常关键。很多面板的 PHP-FPM 以 www 用户运行,如果文件所有者是 root,PHP 进程就没有权限写 config.php,安装脚本会卡在“写入配置”这一步,界面却只给你一句笼统的“安装失败”。遇到这种问题,先不要在代码里找原因,直接看目录用户组就明白了。chmod 部分我特意区分目录和文件:目录用 755 保证可读可进入,文件用 644 保证数据安全,不要把整个目录丢一个 777 上去,那是把后门敞开给所有人。
如果安装时提示数据库连接失败,先回到第一步核对数据库主机名。很多虚拟主机不是 localhost,而是类似“sql.你的主机商域名”这样的地址。调试的时候,在 db_config.php 里填错成 localhost 是最常见的错误。
2.3 数据库连接与 config.php 常见配置项
安装脚本跑完,会在数据库中生成对应的表。如果你想知道系统到底存了什么,直接打开数据库看表结构比在后台点配置更快。我的做法是安装完成后立刻打开 db_config.php 核对一遍,确认填进去的信息没有乱码或引号被转义。
config.php 里的配置项大概长这样,这里的字段名是按常见 PHP 防红系统的写法给出的参考,具体以你解压后的实际代码为准:
<?php // 全局配置示例,安装完成后可自行调整 $config = [ 'db_host' => 'localhost', 'db_name' => '你的数据库名', 'db_user' => '你的数据库用户', 'db_pass' => '你的数据库密码', 'api_url' => 'https://防红接口地址', 'api_key' => '接口密钥', 'timeout' => 3, 'log_switch' => true, 'log_file' => __DIR__ . '/logs/check.log', ];api_url 是后台自定义防红接口的核心参数。它的意思是:当用户访问你的网站时,index.php 会把这个请求的特征数据拼好,发给这个 URL,接口返回“放行”或“拦截”的结果。timeout 建议设置 3 秒以内,宁可验证失败放行,也好过把网站用户全部卡在等待上。把 timeout 设成 10 秒或 30 秒是新手常见误区——防红接口真的挂了,你的网站也跟着卡死,得不偿失。
3. 后台自定义防红接口:配置项怎么填、参数怎么理解
3.1 后台的“自定义接口”到底改的是什么
这套系统叫防红系统,核心动作就是“验证请求”。后台能自定义防红接口,意思是你可以把验证逻辑指向不同的服务商或自建服务,而不需要改动 index.php 的代码。这一点在换服务商的时候省事得离谱。
我拆过同类系统,它们最常见的实现方式是:index.php 拿到用户请求后,整理出 IP、UA、请求时间、来源地址这几个特征字段,拼成一个 POST 请求发给你在后台配置的接口地址。接口返回一段 JSON,系统根据 JSON 里的状态码决定是放行还是弹拦截页。用大白话说,后台填的那个接口地址,是一条“找谁来判断”的线索,填哪家,就由哪家来判断你的访客是不是异常流量。
理解了这一点,你才会明白为什么这套系统要求后台可配置而不是代码写死。因为防红接口的地址、密钥、白名单规则,都是运营过程中会频繁变的东西。写死在 index.php 里,每次调整都要开编辑器改文件、担心语法错误;做成后台配置,只需要在网页上填一下保存。原系统把这点做成了核心卖点,并不是夸大的功能描述,而是实际部署中最常操作的入口。
3.2 三个参数组:接口信息、校验规则、拦截策略
后台的配置项大致可以分为三组。第一组是接口连接信息,第二组是校验规则,第三组是拦截后的表现。我把常用的参数整理成了一个表格,方便你在后台填写时对照:
| 参数组 | 参数名 | 推荐值 | 说明 |
|---|---|---|---|
| 接口信息 | 接口地址 | https://api.example.com/check | 接收 POST 请求并返回 JSON 判定结果 |
| 接口信息 | 接口密钥 | 32位随机字符串 | 用于签名验证,防止别人伪造请求 |
| 接口信息 | 请求超时 | 3 秒 | 超过时间自动放行,避免拖垮站点 |
| 校验规则 | 白名单IP | 你自己或合作的固定IP | 命中白名单直接放行,不请求接口 |
| 校验规则 | UA 关键词 | 空或指定爬虫UA | 命中关键词可直接放行,比如搜索引擎爬虫 |
| 拦截策略 | 拦截状态码 | 403 | 返回给被拦截访客的 HTTP 状态码 |
| 拦截策略 | 拦截提示页 | 空或指定页面 | 空则输出一行提示,指定则跳到弹窗页 |
| 拦截策略 | 日志开关 | 开启 | 把每次判定的时间、IP、结果写入日志文件 |
接口地址和密钥是必填项,其他都可以先用默认值。有一个隐蔽细节:密钥不止是你填在后台用来通过验证的,在请求第三方接口时,它通常还要参与签名。有些服务商要求把密钥跟时间戳拼接做 MD5,再当作一个参数传过去。这份系统的无加密源码里能找到具体签名逻辑,你换接口时一定要看它要求的签名方式,不能只填个 URL 就完事。
3.3 接入自己网站:PHP 引入和 JS 调用的两种方式
后台接口配好之后,网站接入的方式有两种常见路线。一种是在 PHP 层做,适合有后端权限的站点;另一种是在前端 JS 做,适合快速演示但安全性弱一些。这套系统本身自带 index.php 的完整验证逻辑,所以多数时候你不用重复写,但如果你想把它的防红能力嵌入另一个网站,PHP 方式可以这样实现:
<?php // 在目标网站入口文件顶部引入防红判断 require_once __DIR__ . '/config.php'; function check_red($config) { $payload = [ 'ip' => $_SERVER['REMOTE_ADDR'] ?? '', 'ua' => $_SERVER['HTTP_USER_AGENT'] ?? '', 'url' => $_SERVER['REQUEST_URI'] ?? '', 'time' => time(), 'key' => md5($config['api_key'] . time()), ]; $ch = curl_init($config['api_url']); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($payload)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, $config['timeout'] ?? 3); $resp = curl_exec($ch); curl_close($ch); $result = json_decode($resp, true); return $result['status'] ?? 'pass'; } $verdict = check_red($config); if ($verdict === 'block') { http_response_code(403); exit('访问过于频繁,请稍后再试'); } // 正常业务逻辑从这里继续这段代码做的事情很清楚:把请求特征打包、带密钥签名、POST 到防红接口、按返回值决定流程。CURLOPT_TIMEOUT 设置 3 秒是防止接口端出问题拖死主站。key 字段用的是 md5(api_key + 当前时间戳),这只是众多签名方式里最简单的一种,具体要不要加盐、用不用 HMAC,看你对接的服务商要求。
用 JS 接入就快得多,发起一个 fetch 请求:
// 前端调用方式,适合临时演示页面 fetch('你的防红接口地址', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ ip: location.hostname, ua: navigator.userAgent, url: location.href, key: '预置密钥' }) }) .then(r => r.json()) .then(res => { if (res.status === 'block') { document.body.innerHTML = '访问被拦截'; } });JS 方式有个硬伤:用户可以直接绕过前端脚本拿到真实内容,防不住刻意刷请求的人。它更适合做提示层,而不是安全边界。如果目标网站流量价值高,务必用 PHP 方式,或者直接把请求在入口阶段处理掉。这套系统默认的 index.php 走的就是服务端判断,符合实际防护需求。
4. 前端资源文件与无加密源码:样式、静态资源、跳转逻辑怎么改
4.1 css 目录的分工:后台框架与业务页面样式怎么拆
很多刚接触这类 PHP 系统的人,一打开 css 目录看到一堆文件就蒙了,以为要全部加载。实际上,css 目录里的文件分了两类:一类是后台管理界面用的框架样式,另一类是前台防红页面专用的业务样式。
oneui.css 这个名字我比较熟悉,它是后台管理模板的通用样式,负责按钮、表格、弹窗这类基础组件的外观。main.css 和 plugins.css 是配套的辅助样式。真正跟防红页面强相关的是 mh.css、mh1.css、mh2.css,其中 mh.css 通常是公共部分,mh1.css 和 mh2.css 分别对应不同业务页面,比如拦截提示页和验证通过页。
想改样式,优先改 mh1.css 和 mh2.css,不要动 oneui.css。原因很简单:框架样式文件体积大、类名多、依赖于 HTML 结构,改错一个选择器可能把后台布局搞崩。业务页面的样式文件小,改动风险低,而且你改了之后能立刻在拦截页上看到效果。
无加密源码带来的最大便利就在这里:你可以用编辑器全局搜索颜色值,比如搜 0x4e73df 或 #4e73df,看到底哪些地方用了这个颜色,然后统一替换。在后台模板类系统里,我用这种方式改过整套主题配色,比在后台找“主题设置”都快。
4.2 index.php 的防红流程:从请求进入到判定的完整链路
index.php 是整个系统前台的核心。我建议你安装完成后,先别急着改,打开 index.php 从头到尾读一遍,搞清请求是怎么一步步走到拦截或放行的。常见的流程是这样:
- 用户请求到达 index.php。
- 引入 config.php 和 db_config.php,建立数据库连接。
- 读取访客 IP、UA、请求地址。
- 先检查数据库里的白名单 IP 表,命中则直接放行。
- 未命中白名单,则调用后台配置的防红接口。
- 接口返回 block,则输出拦截提示并终止;返回 pass 则继续执行页面逻辑。
这套流程里最容易被忽略的是第 4 步。很多人配置完接口,发现自己的访问也被拦截,第一反应是去改接口地址,其实只要把自己的 IP 加进白名单列表,问题就解决了。白名单校验在调用接口之前,意味着它在本地完成,不依赖外部接口的可用性,所以调试期间先把自己的 IP 加进去,这是稳定访问后台的前提。
download.php 则是给下载请求做校验的。有些网站资源下载路径被人恶意刷流量,download.php 会先判断请求来源是否通过了防红验证,没有验证的直接拒绝,避免下载接口变成消耗带宽的漏洞。你在后台开启日志后,可以在日志文件里看到 download.php 写下的判定记录。
4.3 无加密源码的修改技巧:改文案、改拦截页、加日志
无加密让改逻辑变得非常直接,但也换来一个坑:改错了没人帮你兜底。我在改这类系统时有一个习惯,先找到最小改动点,再动手。比如只改拦截页文案,就不用动 index.php 的逻辑代码,在拦截提示字符串处替换即可:
<?php // index.php 中拦截提示部分的改造示例 $tips = [ 'title' => '访问暂时受限', 'message' => '当前访问请求异常,请稍后刷新重试', 'retry' => 30, ]; if ($verdict === 'block') { http_response_code(403); echo '<!DOCTYPE html><html><head><meta charset="utf-8">'; echo '<title>' . $tips['title'] . '</title></head><body>'; echo '<h2>' . $tips['message'] . '</h2>'; echo '<p>' . $tips['retry'] . ' 秒后可重试</p>'; echo '</body></html>'; exit; }这样做比直接输出一串 JSON 提示更友好,也方便稍后接入更复杂的拦截页面。在此基础上,你还可以把它改成读取一个独立的 block.html 文件:
if ($verdict === 'block') { http_response_code(403); readfile(__DIR__ . '/block.html'); exit; }把拦截页拆成独立文件,好处是改文案不需要碰 PHP 逻辑,运营人员都能直接改 HTML。这个习惯我一直保留,因为很多站点后期要频繁调整拦截页文案来降低误拦截投诉,独立的 HTML 文件比在 PHP 字符串里拼 HTML 高效得多。
5. 上线避坑记录:PHP 版本、安装失败、后台白屏、接口失效的 5 个排错记录
5.1 安装脚本白屏或直接 404
现象:访问 install.php 页面空白,或者返回 404。
原因:这套系统要求 PHP 7.0 环境。如果你的站点跑的是 PHP 5.6 或 PHP 7.4+/8.x,部分函数或语法不兼容,安装脚本执行到一半就中断,页面什么也不输出。当然也有可能是伪静态规则把 .php 结尾的请求拦截掉了。
解决:先在站点设置里把 PHP 版本切换为 7.0,再刷新安装页。如果你用的主机面板支持多 PHP 版本切换,切完基本能解决 90% 的白屏问题。改完仍然 404,再检查伪静态规则,临时停掉伪静态直接访问 install.php 试试。
5.2 安装时报数据库连接失败,后台进不去
现象:install.php 填写完数据库信息后,提示连接失败,安装无法继续。
原因:最常见的是数据库主机地址填错。本地集成环境用 localhost 没问题,但云服务器或虚拟主机上,数据库地址往往是一长串域名,而不是 localhost。第二个原因是数据库用户和密码带了隐藏空格,复制粘贴时最容易出现。
解决:打开 db_config.php,把 db_host 改成面板里显示的数据库地址。填完再检查用户名首尾是否有空格。如果还是连不上,去面板的数据库管理页面用同样的账号密码试着登录一次,能进说明配置匹配,进不去说明账号密码本身有误。
5.3 admin.php 后台白屏或提示“无权访问”
现象:安装正常完成,但访问 admin.php 时白屏,或者提示权限不足。
原因:安装后没有按提示删除或改名 install.php,安全组件或主机防火墙检测到安装文件仍存在,主动拦截后台入口。另一种可能是后台登录 session 写不进去,目录没有写入权限。
解决:先删除或改名 install.php,再访问 admin.php。依然白屏就把 runtime 或临时目录的权限放宽,检查目录属主是否跟 PHP-FPM 一致。我遇到这种情况十次有八次是 install.php 没处理干净。
5.4 配置了防红接口后,全站访问超时
现象:后台填好接口地址保存后,打开网站首页要等 10 秒以上,甚至直接超时。
原因:防红接口地址不可用,或者反向代理不通,而 index.php 里调接口的等待时间设置得过长。系统调用接口是阻塞式的,外部接口不返回,你的首页就一直挂着。
解决:把 config.php 里的 timeout 改成 3 秒,确保接口异常时快速放行。同时检查接口地址有没有写错协议,比如接口是 http 而填成了 https,证书校验失败也会一直卡到超时。调试期间可以在本地用 curl 手动请求一次这个接口,确认返回格式确实是 JSON 且包含 status 字段。
# 用 curl 模拟一次防红接口调用,验证接口可用性 curl -X POST '你的接口地址' \ -d 'ip=127.0.0.1&ua=test&url=/&key=你的密钥' # 正常会输出类似 {"status":"pass","msg":"ok"} 的结果 # 如果超时或无输出,说明接口地址本身有问题5.5 改完 config.php 不生效,后台配置保存了但前端还是旧逻辑
现象:在后台修改了防红接口地址,保存成功,但访问 index.php 时仍然请求旧地址,甚至改了 config.php 里的常量也没反应。
原因:PHP OPcache 缓存了旧配置。大多数面板默认开启 OPcache 加速,config.php 被缓存后,修改文件内容不会立即生效。
解决:改完配置后,去面板里清一次 PHP 缓存,或者重启 PHP-FPM。如果是在命令行操作,可以用 PHP CLI 执行 opcache_reset() 或在代码临时加一句触发重置。从那以后,我每次改这类 PHP 系统的配置,都要强制走一遍“改文件 → 清缓存 → 请求验证”的流程,不再靠刷新浏览器硬猜。希望帮到你。
6. 进阶验证:写一个日志观察脚本,确认防红接口真的在工作
6.1 日志落点与分析逻辑
这类系统通常可以开启日志开关,把每次防红判定的结果写到文件里。日志行一般包含时间、判定结果、IP 三个关键字段。有了日志,就不需要靠用户反馈来猜防护是否生效,直接看数据即可。
我用了一个最简单的按分钟聚合脚本,统计每分钟放行和拦截的数量。当拦截量突然升高,说明可能遭遇了异常流量;当拦截量长期为 0,则要反过来怀疑接口是不是一直静默放行,配置根本没生效。
6.2 Python 按分钟聚合统计脚本
import re from collections import Counter from datetime import datetime log_path = "/www/wwwlogs/防红接口.log" pattern = re.compile( r"(?P<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) " r"(?P<verdict>pass|block) " r"(?P<ip>[\d\.]+)" ) counter = Counter() with open(log_path, encoding="utf-8", errors="ignore") as f: for line in f: m = pattern.search(line) if not m: continue minute = m.group("time")[:16] counter[(minute, m.group("verdict"))] += 1 for (minute, verdict), cnt in sorted(counter.items())[-20:]: print(f"{minute} {verdict}: {cnt}")这个脚本逻辑很直白:按日志里的时间字段取前 16 位作为分钟维度,再用 Counter 累计同一分钟内 pass 和 block 的次数。我通常把它放在服务器上,用 crontab 每小时跑一次,输出最近 20 分钟的趋势。如果某个时间段 block 数量突然冲高,再结合访问日志去查具体来源 IP。
这里有一个容易翻车的细节:日志格式不是一成不变的。有的版本时间字段放在最后,有的字段名不一样,正则写死会导致脚本统计不出数据。我一般先用 head 查看真实日志前五行,再对着行格式调整正则。这不算聪明,但管用——代码能跑的前提是格式匹配,而不是脚本写得漂亮。这套系统无加密,日志格式可以自己改,加一列接口响应时间也不难,统计脚本跟着调整即可。最后强调一次:无论是接口标识还是密钥签名,务必先在测试环境验证一遍再切生产,防止把验证逻辑改坏还不自知。
本文还有配套的精品资源,点击获取