Files
Sdf1_login/readme.md
T
2026-10-16 03:53:25 +00:00

96 lines
8.5 KiB
Markdown
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.
# Sdf1_login Web 端(PHP 后端)
## 开源协议
本项目(Sdf1_login 的 PHP Web 后端,配套 Java 插件一同授权)采用 **GNU Affero General Public License v3.0(AGPL-3.0)**,协议全文见 [LICENSE](LICENSE)。
- 你可以自由使用、修改、分发本项目。
- **本项目本身就是网络服务,若你部署为对外网站/服务,必须向使用者提供完整的对应源代码**(AGPL 第 13 条)。
- 衍生作品必须同样以 AGPL-3.0 授权分发。
- 本项目按「原样」提供,不附带任何担保。
> **部署者须知**:请把根目录的 [`开源地址.txt`](开源地址.txt) 里的地址改成**你自己**的后端源码仓库地址(第一行非 `#` 注释的 http/https 地址即生效)。玩家端页脚会自动读取并展示该地址,用于满足 AGPL 对网络服务提供源码获取途径的要求;出厂默认指向 [`https://git.ypshidifu.cn/youpaishidifu/Sdf1_login/src/branch/php/`](https://git.ypshidifu.cn/youpaishidifu/Sdf1_login/src/branch/php/)。
> 本目录是 Minecraft PaperMC 插件 **`Sdf1_login`**(即本仓库的 `../Sdf1_login`)配套的 PHP Web 后端。
> 两个工程是**一对**:Java 插件负责游戏内逻辑(登录注册、债券经济、商城、领地、工单、PVP…),
> 本目录负责 Web 侧的界面与数据(玩家面板、管理后台、收银台、在线充值、正版登录)。
## 1. 两个工程的关系(一图流)
```
游戏内(Java 插件 Sdf1_login) Web 侧(本目录)
───────────────────────────── ───────────────────────────
/reg /login /cypay /shop /web /mslogin ◄──► login.php / player.php 玩家面板
/sdf1_login 管理面板 ◄──► admin.php 管理后台(19 模块)
商城/CDK/债券流水 权威数据在 Java ◄──► cashier.php 独立收银台
api/pay.php 彩虹易支付在线充值
数据通道:① Java 调 PHP 的 api/sync.php(HTTP,带 secretKey,60+ action 推/拉)
② 共享 SQLite 队列(web.db 里的 pending 表,Java 每 5 秒轮询消费)
③ 领地/用户组等变更走 web_admin_changes 队列双向同步
```
- 对应文档:Java 端 `../Sdf1_login/README.md`(使用手册)
## 2. 目录结构速览
| 路径 | 说明 |
|---|---|
| `config.php` | **全部配置入口**:SECRET_KEY(必须与 Java 端一字不差)、管理员账号、SMTP、游戏库路径、人机验证厂商选择。仓库里是 `REPLACE_ME_*` 占位符,真实值只在服务器 |
| `core.php` | 公共引擎(约 80KB):SQLite 单例(WAL + 锁竞争调优)、建表/迁移、Token 双轨体系、管理员/收银员会话、SMTP、IP 风控黑名单入口拦截。**几乎所有文件都 require 它** |
| `security.php` | 2026-09-29 入侵事件后的三层加固:TOTP 二次验证 + IP 白名单 + 后台访问令牌 + 会话纪元 |
| 页面层 | `login.php` → `player.php`(玩家 SPA,242KB);`admin_login.php` → `admin.php`(管理 SPA,230KB,内嵌 `cashier.js` 收银模块);`cashier.php` 独立收银台;`service.php` 服务商面板;`freeze.php` / `reset_password.php` 邮件自助;`active_players.php` / `online_curve.php` / `today_bonds.php` 统计页(兼 JSON API);`admin_2fa_setup.php` 安全配置引导页 |
| `api/` | 接口层,核心是 **`sync.php`**(Java↔PHP 唯一同步入口,60+ action);其余:`admin.php` 后台 API、`shop.php` 商城、`cdk.php`、`pay.php` + `poller_online.php` + `pay_poller.php` 支付与补单、`minecraft_auth.php` MS 正版 OAuth 代理、`land_api.php` 领地/用户组、`ticket.php` 工单、`security_alert.php` 异地登录回调、`sn.php` 物品 SN 防刷等 |
| `db/` | **`web.db`**(约 40 张表,PHP 读写、Java 经接口读写,绝不直开文件)+ **`orders.db`**(纯 PHP 独占:pay_orders / cashier_orders / shop_configs / mc_auth_sessions / cashiers,拆独立库是为了消除 SQLite 文件锁竞争) |
| 文档 | `pay.md`(订单号格式配置) |
## 3. 数据:三个 SQLite 库的分工
| 库 | 谁读写 | 内容 |
|---|---|---|
| `db/web.db` | PHP + Java(Java 经 `api/sync.php` 等 HTTP 接口,不直开文件) | users、tokens、weblogin_*、shop_items、cdk、web_transactions、bond_cache、online_players、web_area_lands/permissions、web_user_groups、web_tickets、SN 系列、各 pending 队列 |
| `db/orders.db` | **纯 PHP** | 在线充值订单、收银台订单、充值档位配置、MS OAuth 会话、收银员账号 |
| 游戏侧 `login.db` / `bond.db` | **Java 独占** | 插件账号与债券账本。PHP 唯一例外:`api/land_api.php` 验证玩家时可直读 `GAME_LOGIN_DB` 兜底 |
## 4. 与 Java 插件的通信模型(重点)
1. **没有 PHP → Java 的 HTTP 调用**(`config.php` 里的 `CALLBACK_PORT` / `GAME_SERVER_HOST` 是历史死配置)。
方向只有 Java → PHP(`sync.php` 等),以及 PHP 写队列表、Java 轮询消费。
2. **四条共享队列**(都在 web.db):
- `web_transactions`(pending):发货/加债券/CDK/充值到账 → Java `pull_pending_transactions` 拉取执行,`confirmed_transactions` 防重
- `sync_requests`:"立即来拉"标记(购物/改价后触发 Java 快速同步)
- `web_admin_changes`:PHP 侧领地删改/用户组变更 → Java 消费后回推最终状态(**Java 是领地权威源**)
- `web_login_requests` / `web_register_requests` / `cdk_validate_requests` / `pending_player_validations`:密码由 **Java 用 login.db 真实凭证校验**,PHP 禁止自验
3. **玩家 Web 登录链**:游戏内 `/web` → Java 生成 weblogin_token 推给 PHP → 浏览器 `login.php?token=` → player.php;
无 token 时走密码 → 写 pending → Java 校验 → 前端轮询 `check_web_login_result`。
4. **在线充值链**:`pay.php` 建单(orders.db)→ 彩虹易支付网关 → notify 验签幂等 + CF WAF 拦截 notify 时的 `poller_online.php` 直扫平台 MySQL 补单双保险 → 写 pending 流水 → Java 轮询加债券到账。
多服共用一张 `pay_order` 表时靠 `PAY_ORDER_PREFIX` 隔离(生产 `RE`,测试改如 `RT`)。
## 5. 四套鉴权
| 角色 | 方式 |
|---|---|
| 玩家 | 游戏内 `/web` 签发的 weblogin_token;或账密(Java 异步校验);3 分钟同 IP 免密快速重连 |
| 管理员 | PHP session + 密码,叠加 `security.php` 三层加固(TOTP / IP 白名单 / 后台访问令牌),被锁外时用 boot 令牌进 `admin_2fa_setup.php` 逃生 |
| 收银员 | `cashiers` 表 bcrypt + 折扣上限 + 现金收款权限 |
| 服务商 | 游戏账号 + `web_service_providers` 授权表 |
## 6. 首次部署清单
1. **改 `config.php` 占位符**:`SECRET_KEY`(与 Java 端 `插件设置` 保持一致,否则同步接口全 401)、`ADMIN_PASS`、`SMTP_*`(不发邮件可留)、`GAME_*_DB/DIR`、`PAY_ORDER_PREFIX`。
2. **首次访问 `https://域名/plugin/admin_2fa_setup.php`** 保存任意一项 → 自动把缺失的 `SEC_*` / `ADMIN_IP_WHITELIST` / 2FA 密钥随机生成并写回 config.php 的 `>>>SEC-UPDATE` 区(写前自动备份 `db/config_bak/`),并转入强制模式。
3. **Java 侧**:WebManager 的 webBaseUrl 指向本站;启用 web 通信后开始 5 秒轮询队列。
4. 部署走 `deploy_php_only.py`(FTP)——脚本**永远排除** `config.php`、`pay_secrets.php`、`captcha_keys.php`、`lsky_keys.php`、`db/`:这些文件仓库里是空模板/占位符,覆盖一次线上真值 = 同步 401 + 后台锁死 + 支付补单全挂(均有事故复盘注释)。
5. 支付商户密钥(汇付/RSA/平台 MySQL/MS OAuth)在 `api/pay_secrets.php`(仓库为范文,真值手工上传服务器)与 `密钥.md`(**仅本地存储,严禁入库**)。
## 7. 安全注意(已知项)
- `api/diag_db_content.php` **无鉴权**可 dump 两库表结构与样例,正式站应删除或加门禁。
- `api/get_online_players.php` 是损坏文件(依赖不存在的 `../inc/function.php`)。
- `sync.php` 里 `web_login_requests` 存的是明文密码(由 Java 消费校验)——web.db 文件泄露 ≈ 全服账号泄露,`db/` 已 git-ignore。
- 仓库版 `config.php` 严禁出现真实口令/密钥(2026-09-29 用户指令,历史事故复盘见文件头注释)。
---