Files
Sdf1_login/config.php
T
ypsdf1 0b63a99719 install页去掉IP白名单门禁并修null告警, 新增0.0.0.0应急逃生通道
- 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 应急用法与用完必删的说明注释
2026-10-09 19:56:34 +08:00

126 lines
8.4 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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