冰狱防红系统源码解析:7个接口与直连/跳转机制详解
发布时间:2026/9/28 16:14:47来源:尧图网络
简介防红链接系统源码包面向网站运营者、推广人员及PHP开发者用于解决推广链接被浏览器或安全软件屏蔽的问题。系统自带7个防红接口支持直连与跳转两种模式前端内置5套模板并支持对接易支付与码支付接口可满足会员站点、电商推广等场景的基本变现需求。压缩包共345个文件以PHP业务逻辑、JavaScript交互脚本、CSS样式与HTML页面为主辅以GIF演示图、SQL数据库备份及配置文件整体体积6.24MB目录结构清晰便于二次开发。已有215人学习下载。对需要快速部署防红体系或研究链接跳转实现原理的开发者而言这份源码提供了可直接上线的完整程序包以及接口调用、支付对接、短链生成等模块的参考实现能节省从零开发的成本。1. 防红链接系统到底在防什么先搞懂直连和跳转的差异第一次看到“防红链接系统源码”这个标题时我以为是普通的短链工具直到把冰狱这个包里的接口逐个捋了一遍才反应过来它防的是“链接变红”。你在微信、QQ里发出的网址被平台判定为风险链接聊天窗口就会显示红色警示用户不敢点。防红要做的不是换个域名而是把访问者分成“平台爬虫”和“真实用户”两类对爬虫返回一个无害的页面对真实用户执行直连跳转或二次跳转。这套源码自带7个接口覆盖生成、检测、跳转、落地、统计适合手里有服务器、想自己搭一套可控防红API的开发者。2. 冰狱防红系统的源码结构7个接口分别承担什么角色我把压缩包解压后第一件事不是看首页而是先把“谁调谁、谁输出什么”搞清楚。这类系统的核心在接口层页面只是壳。下面按我拆包的顺序把7个接口的职责、参数和返回约定说清楚。2.1 入口文件与7个接口的职责划分解压后常见的目录布局是这样的冰狱防红/ ├─ index.php // 短链生成入口写入短码和原始URL ├─ api/ │ ├─ check.php // 访问端检测返回平台类型和放行结果 │ ├─ direct.php // 直连跳转302直接落地 │ ├─ redirect.php // 跳转防红先经过中间页再跳到目标 │ ├─ landing.php // 落地页渲染输出带JS跳转的HTML │ ├─ stat.php // 点击统计记录UA、IP、时间 │ ├─ config.php // 动态配置接口读数据库里的开关参数 │ └─ qrcode.php // 二维码生成配合落地页使用 └─ config.php // 数据库、密钥、默认域名配置这里index.php不算接口真正的7个接口全在api目录下。check.php负责最核心的判断它读取请求里的User-Agent识别是微信内置浏览器、QQ内置浏览器还是普通浏览器然后返回一个JSON指明当前访问应该走直连还是跳转。direct.php和redirect.php是两个执行出口前者直接返回302的Location头后者输出一段带着JS跳转的HTML。landing.php则是跳转防红的关键它把一个合法页面渲染给平台看用户打开后由前端脚本再跳走。stat.php会把每次访问写入日志qrcode.php方便你在物料上放二维码。理解接口定义时最容易被忽略的是返回内容的类型差异。check接口返回JSONdirect接口返回空body加Location头landing接口返回完整HTML。这三个类型差别很大后续做二次开发时如果把HTML接口当成JSON去解析就会一直拿到空数据。所以拿到源码后建议先用浏览器和curl把每个接口的响应头、响应体分别看一遍确认它们各自的Content-Type和结构。2.2 直连防红和跳转防红两条链路的执行差异标题里特意写了“支持直连和跳转防红”这两种模式不是简单的开关而是两条完全不同的网络链路。我把它们的区别整理成一张表对比项直连防红跳转防红用户感知点击后直接打开目标网址先看到中间页等待1秒左右自动跳走平台爬虫感知收到302响应URL最终指向目标域名收到200 HTML页面里没有直接暴露目标域名响应头Location: 目标URLContent-Type: text/html适用场景域名比较新、还没被平台标记域名已经被盯上需要靠落地页缓冲失败代价被平台抓一次就进黑名单落地页代码也会被扫但能撑更久直连模式本质上就是传统短链加UA过滤优点是快缺点也很明显平台检测时只要发现你的域名频繁302跳转到外部域名用不了多久就会把你这个域名拉黑。跳转防红则不同平台爬到的是一个200状态码的HTML页面页面里看起来是一篇普通内容HTML源码里找不到完整的目标URL。等真实用户打开这个页面后JS才会拼出真实地址并触发跳转这就是它能避开部分检测的原因。在实际使用中我一般不建议把所有流量都切到跳转模式。跳转模式虽然更安全但多一个中间页意味着多一次加载用户流失率会明显上升尤其是从微信侧广告点进来的用户等待超过1秒就容易关掉页面。理想的状态是默认走直连当check接口识别到平台爬虫或者风险UA时才动态切换成跳转模式。2.3 配置文件里的参数定义与默认值这套系统的行为边界基本都由config.php控制。我整理了一份带注释的配置片段?php // config.php 主要参数按常见防红系统布局整理 return [ db [ host 127.0.0.1, port 3306, name bingyu_link, user root, pass , ], api [ key your_sign_key_here, // 接口签名密钥二次开发时用 mode auto, // auto/direct/redirect 三种模式 expire 30, // 落地页有效时间单位分钟 ], domain [ main https://your-domain.com, backup [], // 备用域名落地页里轮换 ], ua [ whitelist [], // 白名单UA优先放行 blacklist [MicroMessenger], // 黑名单UA触发中间页 ], ];其中modeauto是最常用的值系统会先调用check接口判断访问者身份再决定用direct还是redirect。expire参数很关键它决定了落地页上那个加密跳转串的有效时长如果设置太短用户点开落地页时发现链接已过期体验很差设置太长别人拿到落地页地址后可以反复提取目标URL防红效果大打折扣。我一般设在20-30分钟之间。whitelist里可以加入自己的浏览器UA这样自己测试时永远走直连不会被落地页干扰。blacklist里除了MicroMessenger还可以根据你经常遇到的平台爬虫UA逐步补充。需要注意的是黑名单匹配用的是strpos所以只要UA字符串里包含MicroMessenger就命中不需要完整相等。3. 本地部署与最小跑通从上传到生成第一个防红短链聊完结构直接进入动手环节。这套系统是PHP写的用Nginx或Apache都能跑。我以Nginx PHP 7.4 MySQL 5.7为例把从上传到生成第一条防红短链的完整路径走一遍。3.1 环境要求与目录权限先确认服务器上装了PHP的curl扩展和mysqli扩展很多精简版PHP安装包默认没带这两个扩展会导致接口调用直接500。目录权限方面重点检查runtime或logs目录是否可写因为stat接口和日志模块要往里面写文件。如果使用宝塔面板大部分权限问题都能通过“运行目录”和“伪静态”设置解决。Nginx伪静态规则是这套系统的命脉接口能不能访问取决于它location / { if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?s$1 last; } } location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/tmp/php-cgi-74.sock; }第一个location把所有不存在的文件路径重写到index.php这样/api/check.php这类请求才能被PHP接收。第二个location负责把.php请求转发给PHP-FPM。如果你放在Apache下则要确认.htaccess生效并且AllowOverride设置为All。很多部署失败都发生在这里接口单文件直接访问能通但用短链码去访问就404问题几乎都出在伪静态规则没配对。3.2 数据库初始化与config.php配置这套系统需要两张基础表短链接表和访问日志表。初始化SQL如下CREATE TABLE urls ( id INT NOT NULL AUTO_INCREMENT, code VARCHAR(32) NOT NULL COMMENT 短码, target TEXT NOT NULL COMMENT 原始URL, mode TINYINT DEFAULT 0 COMMENT 0自动 1直连 2跳转, expires_at DATETIME DEFAULT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_code (code) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE logs ( id INT NOT NULL AUTO_INCREMENT, code VARCHAR(32) NOT NULL, ua VARCHAR(255) DEFAULT , ip VARCHAR(64) DEFAULT , created_at DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;urls表里code字段是短码必须唯一生成短链时如果发现code重复会重新生成。target字段存原始地址mode字段控制这条短链走哪种防红方式0表示跟随全局配置1强制直连2强制跳转。logs表是点击记录stat接口每次写入一行这也是排查问题时最常用的表。建完表后把config.php里的数据库名、用户名、密码改成你自己的。这里有个高发坑MySQL 8默认的caching_sha2_password认证方式对PHP 7.2以下的mysqlnd扩展不友好容易报Access denied。最简单的方法是建用户时指定mysql_native_passwordCREATE USER bingyulocalhost IDENTIFIED WITH mysql_native_password BY your_password; GRANT ALL PRIVILEGES ON bingyu_link.* TO bingyulocalhost; FLUSH PRIVILEGES;3.3 用curl验证7个接口的返回格式环境就绪后先不急着写页面用curl把核心链路打一遍。我通常按这样的顺序测# 1. 生成短链 curl -X POST https://your-domain.com/index.php \ -d urlhttps%3A%2F%2Fexample.com%2Fnotice \ -d modeauto \ -H X-Api-Key: your_sign_key_here # 2. 用微信UA访问check接口确认返回跳转模式 curl https://your-domain.com/api/check.php?codeabcd1234 \ -H User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.32 # 3. 用普通浏览器UA访问check接口确认返回直连模式 curl https://your-domain.com/api/check.php?codeabcd1234 \ -H User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 # 4. 查看直连跳转的响应头 curl -I https://your-domain.com/api/direct.php?codeabcd1234第一步生成短链时正常会返回一个JSON里面有短码和完整的短链地址类似{code:abcd1234,short_url:https://your-domain.com/abcd1234}。第二步用微信UA请求check接口返回的JSON里mode字段应该是redirect同时会带上落地页跳转参数。第三步换成普通浏览器UAmode字段就变成direct。第四步用-I参数发起HEAD请求能直接看到返回了302以及Location头指向的目标URL。如果第二步返回的还是direct别急着改代码先确认check.php里blacklist配置是否生效以及UA关键字有没有拼写错。MicroMessenger针对的是微信内置浏览器QQ浏览器则是QQBrowser。拿不准时可以在本地用浏览器的开发者工具切换UA来反复测试。4. 直连与跳转的切换逻辑UA检测、域名白名单与回落跑通接口之后真正决定这套系统能不能用的是防红切换逻辑写得好不好。这个逻辑不是简单地“微信UA就跳转其他UA就直连”里面还有白名单、空UA回落、缓存边界等一堆细节。4.1 UA检测与平台判断的匹配顺序check接口的检测逻辑一般长这样// api/check.php 检测逻辑示例 $ua $_SERVER[HTTP_USER_AGENT] ?? ; $mode direct; // 白名单优先自己的测试UA直接放行 foreach ($config[ua][whitelist] as $white) { if (strpos($ua, $white) ! false) { $mode direct; break; } } // 黑名单其次常见内置浏览器UA触发跳转防红 if ($mode direct) { foreach ($config[ua][blacklist] as $black) { if (strpos($ua, $black) ! false) { $mode redirect; break; } } } // 最后是“回落”既不在白名单也不在黑名单走默认配置 if (empty($ua)) { $mode $config[api][mode] auto ? redirect : $config[api][mode]; }这段代码的匹配顺序很重要。白名单判断必须在黑名单之前否则你自己把微信UA加进黑名单测试时即使白名单里也包含你的设备标识照样会被黑名单命中。黑名单一旦命中就直接切到redirect。最后的空UA回落处理解决的是部分爬虫请求不带User-Agent的情况这时候默认走redirect更安全。这里有个容易被忽略的边界HTTP的User-Agent可以被任意伪造。平台爬虫、普通浏览器、微信内置浏览器在UA层面并没有本质区别。所以UA检测只能提高识别概率不能保证绝对准确。这也是为什么很多防红系统里还会叠加IP段、设备指纹、访问频次等特征。如果你只靠UA黑名单那平台换一个UA就能绕过。4.2 直连模式下301和302的选择直连防红的落点就是给一个重定向响应。这里选择301还是302会直接影响整个系统的抗封能力。// direct.php 直连跳转核心代码 header(Location: . $target, true, 302); exit;我用的是302临时重定向。原因是301会被浏览器和搜索引擎长久缓存一旦用户第一次通过301跳到目标页浏览器在你换域名或改目标URL之后仍会直接读缓存连你的防红系统都不经过。平台爬虫如果抓到301也可能把缓存结果保存很久相当于你的新配置一直不生效。302每次都会回源重新判断虽然多一次请求但保留了后续修改的空间。还要注意一点header的第二个参数在PHP里控制是否替换同名头传true没问题但有的PHP版本对Location跳转会默认发送301所以要显式写302。很多翻车案例都是这里漏了状态码导致平台认为你是永久跳转。4.3 跳转防红中落地页的加密串与过期时间跳转模式的核心不是跳转本身而是“落地页怎么把目标地址藏起来”。如果直接在HTML里写明文目标URL平台爬虫看一遍源码就能把域名抓出来。常见的做法是生成一个带签名的加密串落地页收到后再拼接出真实地址。// 生成带签名的跳转参数 $payload json_encode([ target $target, expires time() $config[api][expire] * 60 ]); $sign hash_hmac(sha256, $payload, $config[api][key]); $jumpUrl /api/landing.php?p . urlencode($payload) . sign . $sign;landing.php收到p和sign后先校验签名是否正确再检查expires字段是否超过当前时间。签名校验失败的请求直接返回错误不输出任何跳转代码。这样即使有人拿到了落地页地址只要密钥不变、过期时间没到他也无法篡改目标URL。落地页里的前端跳转我习惯用延时JSscript setTimeout(function(){ location.href atob(?php echo base64_encode($target); ?); }, 600); /script先把目标URL做base64编码放进JS前端解码后赋给location.href。这层base64不是为了挡人而是为了不让爬虫一眼看出完整域名。要记住页面一旦下发到浏览器真实地址最终一定会暴露在网络请求里所以落地页只能增加抓取成本不能做到绝对隐藏。这也意味着跳转防红真正的价值是“让平台爬虫抓不到”而不是“让用户看不到”。4.4 多域名白名单和轮换策略单一域名跑久了避免不了被标记。所以比较成熟的部署会在落地页里做“多域名轮换”。config.php里有一个backup数组落地页每次渲染时随机选择一个备用域名动态拼到跳转链接里。如果主域名被封你只需要把主域名从配置里去掉所有落地页自动改用备用域名。配合每天定时更新短链而不是一个短链跑几个月能明显延长整个系统的生存周期。这个策略的本质是把风险分散到多个域名上。但注意备用域名不是越多越好每个域名都要备案、都要配置解析成本很高。而且在平台眼里同一个注册主体下的多个域名可能被批量识别所以很多做这行的人会选择用不同主体的域名。5. 避坑冰狱系统常见的5个翻车现场与排查这套系统我已经部署过不止一次也帮人排过不少问题。下面这5个坑是重复率最高的每个都按“现象→原因→解决”来写你照着排查能省很多时间。5.1 接口返回404但页面能正常打开伪静态规则没配对现象访问index.php正常但直接访问/api/check.php?codexxx返回404。原因Nginx伪静态规则里把/api/开头的请求也重写到了index.php但PHP侧没有正确的path_info解析导致找不到实际文件。解决先确认Nginx里没有单独的location /api/规则如果有把它注释掉。然后在检查目录里确认api目录下的PHP文件确实存在。再跑一次curl -I访问接口文件看返回的是200还是404。如果是404多半是伪静态rewrite规则把实际存在的文件路径也拦了需要加上if (-e $request_filename)的判断。5.2 微信里点开链接仍然提示已停止访问落地页里直接放了原始URL现象跳转防红模式下微信内打开短链落地页渲染正常但几秒后跳转到目标域名时微信弹出红色风险提示。原因平台爬虫不仅看落地页的状态码还会下载HTML内容做嗅探。如果落地页源码里出现了完整的https://目标地址无论藏在meta还是JS里都可能被抓取到。解决不要把完整URL一次性输出到HTML里。把域名、路径、参数拆成三段在JS里拼接或者用字符串反转、字符编码等方式让爬虫的静态分析匹配不到完整域名。但这只是增加成本平台用无头浏览器完整执行JS后照样能抓到真实地址。5.3 跳转死循环落地页和目标页来回跳转现象用户点开短链后在落地页和目标页之间反复跳转浏览器地址栏一直闪最后提示“太多重定向”。原因落地页里有一个token校验目标页也做了同样的防红处理两个页面通过URL参数互相传递状态但某个参数没被正确解析导致目标页认为这个访问不合法又跳回落地页。解决在目标页的防红判断里如果URL已经带上了落地页生成的token就直接放行不再做二次跳转。同时注意token的有效期不能太短否则用户在落地页停留片刻后再跳转token已经失效又会被踢回落地页。5.4 接口被刷短码可预测导致日志暴涨现象logs表在几分钟内多出几十万条记录服务器CPU飙高短链接口响应越来越慢。原因短码如果基于自增ID做base64编码攻击者可以按顺序遍历请求而且check接口没有做签名校验和频率限制。解决短码生成时加入随机字符比如用md5(uniqid(mt_rand(), true))截取前面8位降低可预测性。同时在check接口和direct接口统一加一层签名参数只有带上正确sign的请求才放行。如果你不想改接口签名可以先用Nginx的limit_req模块做IP频率限制至少能挡住大部分暴力遍历。5.5 数据库连接失败PHP版本和MySQL认证方式不匹配现象接口返回500日志里只有一行“Access denied for user”。原因MySQL 8默认的caching_sha2_password认证插件跟PHP的mysqlnd扩展在旧版本上不兼容。解决重新创建数据库用户并指定mysql_native_password。如果你用的是宝塔面板也可以在数据库设置里把认证方式改成兼容模式或者直接把PHP版本切到7.4以上。这类问题最隐蔽的地方在于网页能正常打开首页因为首页没有查数据库但接口一执行SELECT就断开。6. 把7个接口改造成自己的API服务统一响应格式与签名校验当你不再满足于用现成短链而是想把7个接口对接进自己的业务时第一件事就是统一返回格式。原版接口有的是JSON有的是纯文本有的是302跳转前端对接很痛苦。我的做法是写一个公共响应函数让所有接口都走同一套JSON结构。function api_response($code, $msg, $data []) { header(Content-Type: application/json); echo json_encode([ code $code, msg $msg, data $data, time time(), ], JSON_UNESCAPED_UNICODE); exit; }然后在check、direct、redirect、landing里把原有的echo输出全换成api_response。302跳转保留但直连接口无业务数据时也要返回一个统一JSON方便调用方一次性拿到所有结果。比如direct接口在不可用时会返回{code:404,msg:link not found}而不是空body。紧接着加签名校验。每次请求都带上p参数和sign参数服务端用HMAC-SHA256重新计算签名不一致就直接拒绝。$p $_GET[p] ?? ; $s $_GET[sign] ?? ; if ($s || hash_hmac(sha256, $p, $config[api][key]) ! $s) { api_response(403, sign invalid); }有了这一层之前说的接口被刷问题就解决了一大半因为攻击者没有密钥构造不出合法签名。再配合过期时间和单IP频率限制基本能扛住常规恶意调用。我自己维护这类系统时最常做的一件事是每天把logs表里的UA字段拉出来跑一遍看看平台爬虫的UA最近更新了什么关键词再把这些词补充进blacklist。这套系统本身的代码逻辑不算复杂复杂的是它每天都要跟平台的规则变化抢时间今天能用的配置下周可能就失效。所以不要把防红当成一次性部署而是当成一个持续调参和维护的小项目来做。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网