From 9e85e64345d115f5c8d0c4d4bfbbe159e2172b86 Mon Sep 17 00:00:00 2001 From: MasonLiu <2857911564@qq.com> Date: Tue, 25 Aug 2026 00:07:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 48 ++++++++++---- app/auth.php | 175 +++++++++++++++++++++++++++++++++++++++++++++++++ config_add.php | 21 +++--- index.php | 36 +++++++--- view_log.php | 56 +++------------- 新开发文档.md | 9 ++- 6 files changed, 260 insertions(+), 85 deletions(-) create mode 100644 app/auth.php diff --git a/README.md b/README.md index ddc71d4..a20d70c 100644 --- a/README.md +++ b/README.md @@ -110,16 +110,19 @@ ## 💻 技术栈 ### 后端 + - **PHP 7.4+**:Web服务器端逻辑 - **Python 3.6+**:后台监控服务 - **SQLite 3**:轻量级数据库 ### 前端 + - **HTML5/CSS3**:页面结构和样式 - **JavaScript**:交互逻辑 - **响应式设计**:支持移动端访问 ### 依赖库 + - **PHP**: cURL, PDO-SQLite - **Python**: requests, schedule, sqlite3 @@ -164,13 +167,15 @@ chmod 755 app/install.sh 首次访问会自动跳转到配置页面,添加第一个VPS平台配置。 +设置访问密码后,进入 `index.php` 或 `config_add.php` 时需先输入访问密码(POST 方式验证),验证成功后建立 PHP 会话(有效期 30 分钟,操作自动续期)。 + --- ## ⚙️ 配置说明 ### 添加VPS平台配置 -1. 访问 `config_add.php?pass=YOUR_API_PASS` +1. 访问 `config_add.php`,首次访问需先设置访问密码 2. 填写配置信息: - **API标识**:自定义名称(唯一) - **网站类型**:选择平台(目前支持魔方平台) @@ -184,6 +189,7 @@ chmod 755 app/install.sh ### 配置示例 **魔方平台配置**: + ``` API标识: 核云IDC 网站类型: 魔方平台 @@ -196,6 +202,7 @@ API密钥: your_api_key ![API_KEY](./src/api.png) ⚠️ **重要提示**: + - 网站链接只填写根域名,不要包含 `/v1` 或 `/api` 等路径 - API标识必须唯一,不能重复 - 确保账户和密码正确 @@ -208,14 +215,18 @@ API密钥: your_api_key #### 查看VPS列表 -访问 `index.php?pass=YOUR_API_PASS`,可以看到: +访问 `index.php`,输入访问密码登录后即可看到: + - 按配置分组的VPS列表 - 每个VPS的状态、IP、配置信息 - 实时统计数据 +> 登录会话有效期 30 分钟(滑动过期),每次请求新数据会自动续期;超过 30 分钟无操作需重新登录。 + #### 操作VPS 每个VPS卡片提供三个操作按钮: + - **⚡ 开机**:启动VPS - **🔴 关机**:关闭VPS - **🔄 硬重启**:强制重启VPS @@ -225,6 +236,7 @@ API密钥: your_api_key #### 刷新VPS列表 点击顶部工具栏的 "🔄 手动刷新VPS列表" 按钮: + 1. 从API获取最新的VPS列表 2. 更新数据库中的VPS信息 3. 获取每个VPS的详细配置(CPU、内存、磁盘、带宽、系统) @@ -243,7 +255,6 @@ sudo systemctl start idc_monitor sudo systemctl status idc_monitor ``` - #### 停止监控 ```bash @@ -284,11 +295,11 @@ sudo systemctl restart idc_monitor ### 数据库文件 -| 文件名 | 用途 | 主要表 | -|--------|------|--------| -| `vps.db` | 存储平台配置 | `configs` | -| `vpslist.db` | 存储VPS列表 | `vps_list` | -| `status.db` | 存储监控记录 | `ping_status`, `vps_summary` | +| 文件名 | 用途 | 主要表 | +| ------------ | ------------ | ---------------------------- | +| `vps.db` | 存储平台配置 | `configs` | +| `vpslist.db` | 存储VPS列表 | `vps_list` | +| `status.db` | 存储监控记录 | `ping_status`, `vps_summary` | ### 表结构 @@ -421,7 +432,8 @@ WantedBy=multi-user.target ### 访问控制 -- **API密码保护**:所有页面都需要通过 `?pass=API_PASS` 验证 +- **会话密码保护**:所有页面通过前端输入访问密码(POST 方式)验证,验证成功后建立 PHP 会话 +- **会话有效期**:单次会话 30 分钟,用户请求新数据后自动刷新会话有效期(滑动过期) - **密码文件**:存储在 `app/pass.php`,权限设置为 600 - **数据库保护**:Nginx配置禁止直接访问 `.db` 文件,或者限制访问app路径需要basic认证 @@ -445,7 +457,8 @@ WantedBy=multi-user.target ### Q1: 页面显示"0台VPS"怎么办? -**A**: +**A**: + 1. 点击"手动刷新VPS列表"按钮 2. 检查配置是否正确(特别是site_url不要包含路径) 3. 查看PHP错误日志:`tail -f /var/log/php/error.log` @@ -455,6 +468,7 @@ WantedBy=multi-user.target ### Q2: 监控服务无法启动? **A**: + ```bash # 检查服务状态 sudo systemctl status idc_monitor @@ -472,8 +486,9 @@ journalctl -u idc_monitor -n 50 ### Q3: exec函数被禁用怎么办? -**A**: +**A**: 系统已经做了兼容处理: + - 如果exec被禁用,会显示友好提示 - 需要手动执行安装脚本:`sudo bash app/install.sh` - 监控服务仍然可以正常运行 @@ -484,11 +499,13 @@ journalctl -u idc_monitor -n 50 **A**: 可能原因: + 1. 数据库中还没有该VPS的记录 2. 多次调用导致状态被覆盖(已修复) 3. API返回异常 解决方法: + - 手动刷新VPS列表 - 检查日志确认API调用是否正常 - 等待下一次监控循环 @@ -498,18 +515,20 @@ journalctl -u idc_monitor -n 50 ### Q5: 如何添加新的VPS平台? **A**: + 1. 在 `app/monitor.py` 中创建新的适配器类 2. 继承 `PlatformAdapter` 基类 3. 实现必要的方法(login, get_vps_list, get_vps_status等) 4. 在 `load_configs_and_create_adapters()` 中添加判断逻辑 示例: + ```python class AliyunAdapter(PlatformAdapter): def login(self): # 实现阿里云登录逻辑 pass - + def get_vps_list(self): # 实现获取VPS列表逻辑 pass @@ -520,11 +539,13 @@ class AliyunAdapter(PlatformAdapter): ### Q6: 数据库文件在哪里? **A**: + - `app/db/vps.db` - 配置数据库 - `app/db/vpslist.db` - VPS列表数据库 - `app/db/status.db` - 监控状态数据库 可以使用SQLite工具查看: + ```bash sqlite3 app/db/vpslist.db .tables @@ -536,6 +557,7 @@ SELECT * FROM vps_list; ### Q7: 如何备份数据? **A**: + ```bash # 备份所有数据库 cp app/db/*.db backup/$(date +%Y%m%d)/ @@ -552,7 +574,6 @@ sqlite3 app/db/vpslist.db ".dump" > backup/vpslist.sql --- - ## 📧 联系方式 - **项目地址**: [https://git.masonliu.com/MasonLiu/VPSHUB](https://git.masonliu.com/MasonLiu/VPSHUB) @@ -564,6 +585,7 @@ sqlite3 app/db/vpslist.db ".dump" > backup/vpslist.sql ## 🙏 致谢 感谢以下开源项目: + - [PHP](https://www.php.net/) - [Python](https://www.python.org/) - [SQLite](https://www.sqlite.org/) diff --git a/app/auth.php b/app/auth.php new file mode 100644 index 0000000..66ea792 --- /dev/null +++ b/app/auth.php @@ -0,0 +1,175 @@ + SESSION_LIFETIME) { + // 销毁过期会话 + $_SESSION = []; + if (ini_get('session.use_cookies')) { + $params = session_get_cookie_params(); + setcookie(session_name(), '', time() - 42000, $params['path'], $params['domain'], $params['secure'], $params['httponly']); + } + if (session_status() === PHP_SESSION_ACTIVE) { + session_destroy(); + } + return false; + } + + // 用户请求了新数据,刷新会话有效期 + $_SESSION['last_activity'] = time(); + return true; +} + +/** + * 验证访问密码并建立登录会话 + * 使用 hash_equals 进行时序安全比对,防止时序攻击 + * + * @param string $password 用户提交的访问密码 + * @return bool 是否登录成功 + */ +function attemptLogin($password) { + if (!defined('API_PASS')) { + return false; + } + + if (hash_equals(API_PASS, (string)$password)) { + // 会话固定攻击防护:重新生成会话ID + session_regenerate_id(true); + $_SESSION['admin_logged_in'] = true; + $_SESSION['last_activity'] = time(); + return true; + } + return false; +} + +/** + * 强制要求登录认证 + * 未认证时输出登录页面并终止当前脚本 + * 已认证时直接返回,不影响后续流程 + * + * @param string $redirect 登录成功后跳转的站内地址(可选,默认回到当前页面) + */ +function requireAuth($redirect = '') { + if (isLoggedIn()) { + return; + } + + // 处理登录表单提交(POST 携带 auth_password) + $error = ''; + if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['auth_password'])) { + if (attemptLogin($_POST['auth_password'])) { + // 登录成功,跳转回目标页面 + $target = !empty($_POST['redirect']) ? trim($_POST['redirect']) : $redirect; + // 仅允许站内跳转,防止开放重定向 + if ($target && strpos($target, '://') === false && strpos($target, '\\') === false) { + header('Location: ' . $target); + } else { + header('Location: ' . $_SERVER['PHP_SELF']); + } + exit; + } + $error = '访问密码错误,请重试!'; + } + + // 构造登录成功后返回的地址(默认当前请求地址) + $currentPage = $_SERVER['PHP_SELF']; + $queryString = $_SERVER['QUERY_STRING'] ?? ''; + $redirectTarget = !empty($redirect) + ? $redirect + : ($queryString ? $currentPage . '?' . $queryString : $currentPage); + + // 输出登录页面 + header('Content-Type: text/html; charset=utf-8'); + ?> + + + + + + + + 访问验证 - VPS Hub + + +
+
+

🔐 VPS Hub

+

请输入访问密码以进入管理面板

+
+ + +
+ + +
+ +
+ + +
+ + +
+ +
+ 💡 登录会话有效期 30 分钟,期间操作会自动续期;超过 30 分钟无操作需重新登录。 +
+
+ + + 403, 'msg' => '访问密码错误'], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); - exit; -} +// 会话认证:前端输入密码验证后建立会话,30分钟滑动过期 +requireAuth(); // 处理添加配置 $message = ''; @@ -383,7 +381,10 @@ $configs = $db->query('SELECT * FROM configs ORDER BY id');

⚙️ VPS配置管理

添加和管理多平台VPS配置

- 返回首页 +
+ 返回首页 + 🚪 退出登录 +
diff --git a/index.php b/index.php index 7337bb8..1c210fe 100644 --- a/index.php +++ b/index.php @@ -1,6 +1,7 @@ 403, 'msg' => '访问密码错误或者未输入密码,请拼接?pass=API_PASS后再尝试访问'], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); +// 处理退出登录(需在会话认证之前,保证已登录用户也能退出) +if (isset($_GET['logout'])) { + logout(); + header('Location: ' . $_SERVER['PHP_SELF']); exit; } +// 会话认证:前端输入密码验证后建立会话,30分钟滑动过期 +requireAuth(); + // 处理操作请求 $message = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST') { @@ -295,6 +297,15 @@ foreach ($vpsList as $vps) { .btn-refresh:hover { background-color: #0056b3; } + .btn-logout { + background-color: #6c757d; + color: white; + text-decoration: none; + } + .btn-logout:hover { + background-color: #5a6268; + color: white; + } .config-title { display: flex; justify-content: space-between; @@ -478,9 +489,14 @@ foreach ($vpsList as $vps) { - - ➕ 添加配置源 - +
+ + ➕ 添加配置源 + + + 🚪 退出登录 + +
@@ -500,7 +516,7 @@ foreach ($vpsList as $vps) {

📭 暂无配置

请先添加VPS配置才能开始管理

- + ➕ 添加第一个配置
diff --git a/view_log.php b/view_log.php index 3d38f54..2f56514 100644 --- a/view_log.php +++ b/view_log.php @@ -1,54 +1,16 @@ - - - - - VPSHUB - 日志查看 - - - -
-

🔐 日志查看权限验证

- -
- -
- - -
-
- - -