- install.php: sqlMdDbConfig 全新站 java/web 槽为 null, $val 闭包加 is_array 兜底, 消除每个输入框的 array offset on null 告警; 门禁只留令牌层(全新站无白名单可言); 安装成功页改为回显本次写入的完整配置供截图手抄, 背景自删 - admin_2fa_setup.php: 引导页白名单框上方显示当前访问IP; 应急模式免密进 boot 模式 并挂红徽标; secInstallPending 让位改为 !secIsEmergency(), 避免与全局应急路由 形成 install/引导页互跳死循环 - security.php: 新增 secIsEmergency() 判定白名单含 0.0.0.0; secIpAllowed 放行该条目; 新增 secEmergencyGate() 在限流层前把非引导页/非本机请求 302 锁回引导页(用302防浏览器缓存) - config.php: 补 0.0.0.0 应急用法与用完必删的说明注释
126 lines
8.4 KiB
PHP
126 lines
8.4 KiB
PHP
<?php
|
||
/**
|
||
* Web通信系统 - 配置文件
|
||
*
|
||
* ★ 本文件随仓库分发,里面的值全部是占位符 —— 请改成你自己的。
|
||
* 任何真实口令 / 密钥 / IP / 令牌都严禁写进仓库(2026-09-29 用户指令)。
|
||
* 部署脚本也不会上传本文件,线上 config.php 只在服务器上由 admin_2fa_setup.php 改写。
|
||
*
|
||
* 拿到代码第一次要改的东西:
|
||
* 1. SECRET_KEY —— 插件(Java)与本 Web 端必须一字不差地相同,否则所有同步接口 401
|
||
* 2. ADMIN_PASS —— 后台管理密码
|
||
* 3. SMTP_* —— 邮件发信用途(不发信可以不管)
|
||
* 4. GAME_*_DB / DIR —— 你服务器上游戏数据库的实际路径
|
||
* 最下面 SEC-UPDATE 区故意是空的:后台访问令牌、IP 白名单、二次验证这三项
|
||
* 在你自己的服务器上首次生成 / 由你自己填,不会进仓库。
|
||
*/
|
||
|
||
// ===== 安全密钥(插件和Web端必须一致) =====
|
||
define('SECRET_KEY', 'REPLACE_ME_SECRET_KEY');
|
||
|
||
// ===== Token配置 =====
|
||
define('TOKEN_EXPIRE_SECONDS', 86400); // 24小时
|
||
|
||
// ===== 数据库路径 =====
|
||
define('DB_PATH', __DIR__ . '/db/web.db');
|
||
// ★ 收银台订单独立库:与 web.db(Java 高频写入)彻底解耦,消除 SQLite 文件锁竞争
|
||
// 订单记录纯属 PHP 收银台自己的数据,Java 永不读写此库
|
||
define('ORDERS_DB_PATH', __DIR__ . '/db/orders.db');
|
||
|
||
// ===== 收银台订单号(2026-10-06 多服隔离)=====
|
||
// ★ 平台 MySQL 的 pay_order 是多商户/多服务器共用表。以前创单和补单脚本都把 'RE'
|
||
// 写死在代码里,结果生产服和测试服用同一个前缀 —— 测试服的补单器每 20 秒轮询一次,
|
||
// 就把生产服的已支付单也捡走补进了测试库(互相串数据)。
|
||
// ★ 现在创单(pay.php)与三个补单脚本(poller_online / pay_poller / recharge_orders_api)
|
||
// 统一读下面这个常量:前缀一致才互认,各部署各改各的即可隔离。
|
||
// ★ 注意:改前缀只影响「新订单」与「补单器还认哪些单」,历史订单数据不受影响;
|
||
// 若某次改了前缀,改动前已生成、尚未补单的订单将不再被本端补单器匹配(按需保留)。
|
||
define('PAY_ORDER_PREFIX', 'RE'); // 生产服 'RE',测试服请改成例如 'RT'
|
||
|
||
// ★ 订单号格式(pay.php createOrder):
|
||
// 前缀 + 年月日时分秒 + 4位随机校验码 + 玩家名
|
||
// 例:RE20261006171418Q101youpaishidifu
|
||
// 加玩家名是为了在共用的 pay_order 表里一眼看出这单属于谁,排查串服问题时最快。
|
||
// 只允许字母/数字/下划线(Minecraft 用户名规则),其余字符会被剔除。
|
||
// ★ PAY_ORDER_MAX_LEN:平台 out_trade_no 字段长度护栏(彩虹易支付标准为 varchar(64))。
|
||
// 超长时自动裁短玩家名段,绝不截断前缀/时间戳/校验码 —— 前缀被截会导致补单器再也认不出这单。
|
||
define('PAY_ORDER_MAX_LEN', 64);
|
||
|
||
// ★ 债券换算不在这里配:金额→债券完全由后台「面板-充值商店配置」(shop_configs.bond_reward)
|
||
// 决定,代码不干预比例;仅在本地订单记录缺失时才用 poller_online.php 里的兜底估算公式。
|
||
// 运维想改成 1 元 10 券还是 1 元 100 券,直接在后台充值商店里调即可。
|
||
|
||
// ===== 管理员认证 =====
|
||
define('ADMIN_USER', 'admin');
|
||
define('ADMIN_PASS', 'REPLACE_ME_ADMIN_PASSWORD'); // 管理员密码
|
||
|
||
// ===== 游戏数据库路径(用于同步) =====
|
||
define('GAME_BOND_DB', 'REPLACE_ME_GAME_BOND_DB_PATH');
|
||
define('GAME_LOGIN_DB', 'REPLACE_ME_GAME_LOGIN_DB_PATH');
|
||
define('GAME_SHOP_DIR', 'REPLACE_ME_GAME_SHOP_DIR_PATH');
|
||
|
||
// ===== Web子目录路径(如 /plugin 或 /test1,根目录则留空) =====
|
||
define('WEBSUB_DIR', '/plugin');
|
||
|
||
// ★ 2026-10-07:已删除「Java插件回调端口 CALLBACK_PORT」与「Java游戏服务器地址
|
||
// GAME_SERVER_HOST」两段 —— PHP→Java 从来只走 web.db 的 SQL 队列(四条共享队列表,
|
||
// Java 5 秒轮询消费),没有 PHP→Java 的 HTTP 调用,这两项是历史死配置(全库无引用)。
|
||
|
||
// ===== 辅助函数:构建相对路径 =====
|
||
function webPath($path = '') {
|
||
return trim(WEBSUB_DIR, '/') . ($path ? '/' . trim($path, '/') : '');
|
||
}
|
||
|
||
// ===== SMTP邮件配置 =====
|
||
define('SMTP_HOST', 'REPLACE_ME_SMTP_HOST');
|
||
define('SMTP_PORT', '465');
|
||
define('SMTP_USER', 'REPLACE_ME_SMTP_USER');
|
||
define('SMTP_PASS', 'REPLACE_ME_SMTP_PASSWORD');
|
||
define('SMTP_SENDER_NAME', 'Sdf1_login');
|
||
define('SMTP_USE_SSL', true);
|
||
|
||
// ===== 人机验证码:全项目只用一家,二选一(改下面这一行的值即可)=====
|
||
// 'CF' → Cloudflare Turnstile(默认:无感、体验最好、基本不用点)
|
||
// 'VA' → VAPTCHA V4(备用:需要点一下"发起验证")
|
||
// 'off'→ 关闭人机验证
|
||
// 取值不区分大小写、兼容全名:cf / cloudflare / turnstile 都算 CF;va / vaptcha 都算 VA。
|
||
//
|
||
// ★ 三个场景(管理员登录、用户后台账密登录、正版验证提交前)全部跟着这一行走,
|
||
// 不会出现"这里是 CF、那里是 VA"的混用 —— 全站厂商由本常量单独决定。
|
||
// ★ 密钥不在本文件:CF 的 sitekey/secret 与 VA 的 VID/VKey 分别写在 captcha_keys.php
|
||
// 的 Cloudflare / VAPTCHA 两段里,只填你启用的那家即可(仓库里是空模板,真值只放服务器)。
|
||
// ★ 本文件没定义本常量时(老版本线上配置),一律按默认 'CF' 处理。
|
||
define('CAPTCHA_PROVIDER', 'CF'); // ← 只改这个值:'CF' 用 Cloudflare,'VA' 用 VAPTCHA
|
||
|
||
// ===== 紧急安全加固(2026-09-29 入侵事件响应,实现见 security.php)=====
|
||
// 第一层:TOTP 二次验证 —— 1Password / Microsoft Authenticator 等标准 6 位动态码(仅校验,无推送)。
|
||
// 第二层:管理面 IP 白名单 —— 未配置白名单时,仅服务器本机 127.0.0.1 与持有 boot 引导令牌的
|
||
// 人可访问后台;其余任何请求一律返回 nginx 原生 404 页(最小化信息透露:让探测者
|
||
// 分不清是文件不存在还是被拦截),拒绝记录写入 db/security.log。
|
||
// ★ 例外 = 全新部署的第一次访问:本区还是空的、web.db 里也没有引导标记时先放行,
|
||
// 引导你把自己的 IP 白名单 / 访问令牌 / 2FA 配齐;配置页一保存即自动转强制模式。
|
||
// 第三层:admin.php 动态访问令牌 —— 只有 https://域名/plugin/admin.php?token=<SEC_ACCESS_TOKEN>
|
||
// 才能打开后台;不带令牌(或令牌错)的请求一律返回 nginx 原生 404 页,
|
||
// 与"服务器上根本没有这个文件"表现完全一致,探测者无从判断。
|
||
//
|
||
// 下面这个区段故意不写任何 define —— 这些是每个部署者自己的安全隐私,严禁入库:
|
||
// SEC_BOOT_TOKEN 引导令牌(被锁在外面时的逃生舱)
|
||
// SEC_ACCESS_TOKEN 后台访问令牌(第三层门禁)
|
||
// SEC_EPOCH 安全纪元(部署加固时作废此前的全部活会话)
|
||
// ADMIN_IP_WHITELIST 你自己的 IP 白名单
|
||
// SEC_2FA_ENABLED / SEC_2FA_SECRET 你自己的二次验证开关与密钥
|
||
// 首次访问 https://域名/plugin/admin_2fa_setup.php 并保存任意一项时,缺失的键会由该页
|
||
// 在你自己的服务器上随机生成并就地补全(写前自动备份到 db/config_bak/),
|
||
// 同时在 web.db 的 sec_bootstrap 表写入一行"引导标记"——
|
||
// 判据 = 本区已有令牌 或 db 有引导标记(任一成立即强制模式)。
|
||
// 被锁在外面时的恢复方法:宝塔/SSH 查看本文件补全后的 SEC_BOOT_TOKEN,访问
|
||
// https://你的域名/plugin/admin_2fa_setup.php?boot=<令牌>
|
||
// 进入配置页把自己当前 IP 加入白名单(boot 令牌本身也是配置页入口)。
|
||
// ★ 令牌全丢的最后手段(2026-10-09):宝塔/SSH 手工给下面 SEC-UPDATE 区的
|
||
// ADMIN_IP_WHITELIST 数组加一条字面量 '0.0.0.0' —— 应急模式立即生效:
|
||
// 除服务器本机外全站所有页面/API 一律 302 锁回 admin_2fa_setup.php(免密进入),
|
||
// 按该页红色横幅指引删掉 0.0.0.0 + 「重新生成令牌」即恢复常态。
|
||
// ⚠️ 0.0.0.0 只是应急门票(等价全网可进引导页),用完必须立刻删除。
|
||
// >>>SEC-UPDATE-BEGIN 本区段由 admin_2fa_setup.php 自动维护,请勿手工改动标记行
|
||
// >>>SEC-UPDATE-END
|