# BCJD 导航 bcjd.net 服务导航页面(PHP + MariaDB 版) ## 功能特性 - **链接分类**:链接按「应用」「运维/管理」「站点」等分组展示 - **权限控制**:支持公开/私有两种权限,私有链接需要登录后才能看到 - **单用户密码登录**:仅需输入密码,无需用户名(基于 PHP Session + bcrypt) - **链接管理**:支持在管理面板中自行添加、编辑、删除链接 - **暗色/浅色主题**:跟随系统或手动切换 - **实时搜索**:按 `/` 聚焦搜索框,回车打开第一个结果 ## 部署步骤 ### 0. 服务器要求 - PHP 8.0+ - MariaDB 10.3+ / MySQL 5.7+ - Web 服务器:Apache 或 **Caddy** - PDO 扩展(php-mysql) > 项目附带了 `.htaccess` 安全配置(Apache 专用)。如果你使用 **Caddy**,这些文件不会被读取,请参考下方 Caddyfile 配置来等效实现安全防护。 ### 1. 克隆项目并配置 ```bash git clone https://github.com/你的用户名/bcjd-html.git /var/www/html # 或上传至服务器后解压 ``` 项目根目录不应作为 Web 入口。**必须将 `public/` 目录设为服务器 DocumentRoot(Apache)或 root 目录(Caddy)。** ### 2. 配置 Web 服务器 #### Apache 编辑 Apache 站点配置(如 `/etc/apache2/sites-available/bcjd.conf`): ```apache ServerName bcjd.net DocumentRoot /var/www/html/bcjd-html/public AllowOverride All Require all granted ``` #### Caddy 由于 Caddy 的 `root` 指令会将网站根限制在 `public/` 目录内,项目根目录下的敏感文件(`config.php`、`init.php`、`db_*.php`、`src/` 等)天然无法被直接访问,无需额外配置路径拦截。 编辑 Caddyfile: ```caddy bcjd.net { root * /var/www/html/bcjd-html/public php_fastcgi unix//run/php/php8.x-fpm.sock file_server # 安全头 header { X-Frame-Options "DENY" X-Content-Type-Options "nosniff" X-XSS-Protection "1; mode=block" Referrer-Policy "strict-origin-when-cross-origin" } # 禁止浏览目录(默认已禁用,无需配置) # 日志(可选) log { output file /var/log/caddy/bcjd.log } } ``` > 如果 PHP 版本不同,将 `php8.x` 改为实际版本号(如 `php8.2`)。运行 `php -v` 查看版本。 ### 3. 配置数据库 编辑 [`config.php`](config.php),修改以下参数: ```php define('DB_HOST', 'localhost'); define('DB_NAME', 'bcjd_nav'); define('DB_USER', '你的数据库用户名'); define('DB_PASS', '你的数据库密码'); ``` ### 4. 初始化数据库 在浏览器访问 `http://你的域名/db_init.php` 脚本会自动创建数据库和表结构,并导入默认链接数据。 **⚠️ 初始化完成后,请删除或重命名 `db_init.php` 文件以保证安全。** **⚠️ Apache 下 `.htaccess` 已自动禁止通过 Web 访问 `db_init.php`;Caddy 下由于 `root` 指令将网站根限制在 `public/` 内,根目录下的 `db_init.php` 天然无法被访问。如需使用请先将文件复制到 `public/` 目录内,用完后立即删除。** ### 5. 修改默认密码 默认密码为 `bcjd2025`。 登录后访问 `http://你的域名/admin.php` →「修改密码」选项卡修改。 ## 项目结构 ``` bcjd-html/ # 项目根目录(不对外暴露) ├── .htaccess # 顶层安全防护(禁止访问敏感文件/目录) ├── config.php # 数据库 & 密码配置 ├── db_init.php # 数据库初始化脚本(用完删除) ├── db_seed.php # 初始链接数据(默认链接在此自定义) ├── init.php # 系统引导(自动加载 + 安全头 + 时区) ├── src/ # OOP 类库(命名空间:BCJD\) │ ├── AutoLoader.php # PSR-4 自动加载器 │ ├── Auth.php # 认证类(CSRF Token + Session 安全 + bcrypt) │ ├── Database.php # PDO 单例管理器(预处理语句 + 严格模式) │ ├── LinkManager.php # 链接 CRUD(参数绑定 + XSS 过滤) │ ├── Response.php # 统一 JSON 响应 │ └── Validator.php # 输入验证净化 ├── public/ # 🎯 Web 入口(服务器 DocumentRoot 指向此目录) │ ├── .htaccess # Apache 安全规则(安全头 + 防目录浏览) │ ├── index.php # 前台首页 │ ├── admin.php # 管理面板(需登录) │ └── api.php # RESTful API 接口 ├── README.md └── LICENSE ``` ## 权限说明 在管理面板添加/编辑链接时,可以设置「私有链接」开关: - **公开**(默认):所有访客可见 - **私有**:仅在登录后可见 登录按钮在首页右上角,点击后弹出密码输入框。 ## 安全架构 | 防护维度 | 实现方式 | |---------|---------| | **SQL 注入** | 全部 PDO 预处理语句 + 参数绑定 | | **XSS 攻击** | htmlspecialchars(ENT_QUOTES) + SVG 白名单过滤 | | **CSRF 跨站请求伪造** | 64 位随机 Token + hash_equals 验证 | | **Session 劫持** | 登录后 regenerate_id + 30 分钟超时 + HttpOnly | | **密码暴力破解** | bcrypt cost=12 + 500ms 登录延迟 | | **信息泄露** | PDO 异常记录日志,用户仅见通用错误提示 | | **HTTP 安全头** | X-Frame-Options / X-Content-Type-Options / X-XSS-Protection / Referrer-Policy | | **目录隔离** | 敏感代码在 Web 根目录之外,无法直接访问 | | **文件级防护** | .htaccess 禁止访问 config/init/db_seed 等敏感文件 | ## 自定义链接数据 项目初始包含 9 条默认链接(Monica、Gogs、Docker、Webmin、phpMyAdmin、Mail、三个站点)。 如需自定义默认数据,编辑 [`db_seed.php`](db_seed.php) 中的 `get_seed_links()` 数组即可,不需要修改 `db_init.php`。 ```php // db_seed.php - 修改后重新运行 db_init.php 即可 function get_seed_links(): array { return [ // 在这里添加/修改你的默认链接 ]; } ```