帮客户二开后的一个刷单源码(不是压缩过的模板):ThinkPHP5 写的抢单 + 商城 + 利息宝平台,前台 15 个控制器、后台 19 个模块、57 条支付插件、11 套语言。5594 个文件、102.7 MB。

体检先给结论:没有发现后门,但有两处必须在上线前处理——包里带着真实数据库账号密码,而且 app_debug 是 true。

规模与体积构成

目录体积说明
public/72 MB多套前台皮肤(static、static_new、static_new6、static_98k、static_down、static_indonesia、alllang…)+ 上传图片
vendor/17.1 MBComposer 依赖
thinkphp/10.4 MB框架本体(TP5,要求 PHP ≥ 7.0)
application/2.9 MB业务代码,唯一需要读懂的部分

前台:15 个控制器把流程串起来

Index(首页)、Shop(商城)、Order(下单)、RotOrder(轮单/派单)、Pay + Callback(支付与回调)、Crontab(定时任务)、My / User(个人中心)、Support(客服)、Send(短信/发信)、Api、Ctrl、Base、Error。

结构是老派 ThinkPHP 写法:控制器里直接写业务、视图是 .html 模板(里面嵌 PHP 和 JS),没有 Laravel 那套中间件分层。好处是改起来不用学框架,坏处是逻辑散,改一处要跟着看三处。

后台:19 个模块,重点是「打针」和「轮单」

  • Inyectar(打针管理,表 xy_inyectar):给指定会员人工加/改数据,抢单盘的核心运营开关
  • Deal(交易/商品、分类、利息宝 lixibao)、RotOrder(轮单)
  • Pay(支付通道配置)、Queue(队列)、Crontab(定时任务)
  • Agent(代理)、User / Users(会员)、Group(权限组)、Menu(菜单)、Config / Usetting(站点设置)、Oplog(操作日志)、Help(帮助/公告)、Auth / Login

有 Oplog 操作日志和队列,说明这套东西是按「有客服、有代理、有运营」的团队规模设计的,不是单机玩具。

57 条支付插件 + 362 条通道参数

application/index/pay/ 下 57 个 PHP 文件,一个文件一条通道:Globalpay 还分了 20/51 三个版本、Vnmcard(越南卡)、Threektpay、Tikpay、Wowpay、Opaysecpay… 覆盖尼日利亚、印度、东南亚、拉美常见的本地收款网关。config/pay.php 里 362 条配置项。

注意:全部是法币网关,没有 USDT / TRC20 这类链上通道(我把 57 个文件全扫了,没有 tron/trc20/usdt 关键字)。要收 U 得自己接。

11 套语言包 + 多套皮肤

application/lang/ 下:en-au、en-els、en-id、en-ww、es-mx、iv-vn、jp、ko、pt-br、tr-tr、zh-cn,每套 24~43 KB(还有一份 lang_*.tar.gz 是备份,12 个文件,没藏东西)。配合 public/ 下多套静态皮肤,能按国家换皮。

体检结论(工具 + 手工双查)

  • 无后门:扫了 application/ 与 public/ 全部 PHP,0 处 eval($_POST)、assert($_POST)、一句话木马、preg_replace /e 型后门
  • 自动扫描报了 110 处 php://input —— 全是支付回调读原始报文(Callback.php 和 57 个 pay 文件),属正常写法,不是注入点
  • public/upload/ 里没有任何 .php 可执行文件(这是抢单盘最常见的挂马位置,这里干净)
  • 模板里 5 处「高危命中」实为:3 处模板内联 JS 的 eval、2 处 meta 里 base64 的水印

三处必须处理的问题

  1. config/database.php 带着真实数据库账号:库名/用户名 d2862_kx7w2m(典型虚拟主机命名),密码明文写在文件里。拿到包的人等于拿到原站数据库凭据——上线前必须换成自己的库,并假设旧凭据已泄露。
  2. app_debug => true:调试模式开着,出错会直接把 SQL、路径、堆栈打到页面上。上线第一件事改成 false。
  3. 没有 SQL 建表脚本,也没有 install 向导:整个包 0 个 .sql、无 install/ 目录。表结构只能从原库导出,或照着 application/ 里的表名(如 xy_inyectar)手工补——这是这套源码最贵的隐性成本。

另外:application/index/view/index/home.html 的 meta 里用 base64 藏了上游卖家的联系方式(解码后是某个源码站的三四个域名 + 一个 TG 号)。要卖或上线,先把这些水印清干净。

实跑记录:这套包是能跑起来的

为了验证「无 SQL」到底意味着多少工作量,我把它在本机跑了一遍:PHP 7.4 + SQLite(原包是 MySQL,改了一行 config/database.php)。过程如下:

  1. 反推表结构:扫描 application/ 与 vendor/zoujingli 里所有 Db::name()/model() 调用,得到 44 张业务表 plus ThinkAdmin 的 system_* 标准表,生成 install.sql。字段按「宁多勿缺」策略生成宽表(xy_users 一次就有 540 列),这样代码里任何 where/insert 都不会因为缺列报错。
  2. 补配置:前台一进去就 500,因为 sysconf() 读 system_config 是空的。意外的是源码包的 runtime/cache/ 里残留着一份序列化的站点配置(57 项:站点名、版权、存储、支付开关…),用 unserialize() 解出来直接灌进库即可。
  3. 补参考数据:xy_index_msg 里缺 tiaokuan(条款)、huodong(活动)两条,xy_level 缺 VIP 等级,xy_lixibao_list 缺利息宝产品——少任何一条,首页/商城就白屏报「Trying to access array offset on value of type null」。
  4. 密码规则:会员是 sha1(密码 + salt + pwd_str),pwd_str 明文写在 config/app.php 里;后台是明文存库,前端提交 md5(密码 + session 里的 skey)。所以后台账号迁移时直接改 system_user.password 明文即可。
  5. MySQL 专有写法:Db::raw('now()') 在 SQLite 下直接报错,改 date() 才行——说明这份代码深度绑定 MySQL,换库不现实。

结论:代码本身是完整的、能跑通的,缺的是数据库。你真正要付的成本不是改代码,而是把 44 张表的结构补回来——要么从原站导一份 .sql,要么照上面的思路反推(我这一步花了大约 20 次调试才让首页、商城、订单、个人中心、后台菜单全部正常渲染)。

另外从截图里能看出一件事:这套是「音乐平台皮肤 + 抢单/刷单内核」——首页是歌单界面(Youtube Music、歌单/我的 TabBar、信用分),业务入口藏在图标格里;模板里还有 {$Think.lang.h_remen} 这类没翻译的占位符,说明语言包并不完整。

部署要点

  1. 环境:PHP 7.0~7.4(TP5 + 老代码,别上 PHP 8)+ MySQL 5.6/5.7;runtime/ 需可写
  2. 伪静态指向 public/,把 application、config、vendor 挡在 web 根之外
  3. 改 config/database.php → 导表 → 关 app_debug → 清 runtime/ 缓存
  4. 支付通道在后台「支付配置」里逐条填商户号/密钥,回调地址必须是公网 https
  5. 上线后把 public/upload/ 的 PHP 执行权限关掉(nginx 里 location ~ [.]php$ 对该目录直接 deny)

适合谁:需要一套多国家、多币种、多网关的抢单/任务盘底座,且自己有 PHP 团队能接手维护的人。这套的强项是支付通道数量与多语言皮肤,弱项是没有安装脚本、代码风格老、处处要手工兜底。

同类系统可以对照 抢单刷单栏目;如果需要现代化架构(Next.js + 后台控盘台),可看 Web3 抢单 DApp 站 v2.0。