bcjd.net front page

caesar 4d8cc85754 feat: add Caddy support and update security configurations 2 bulan lalu
public 4d8cc85754 feat: add Caddy support and update security configurations 2 bulan lalu
src 4d8cc85754 feat: add Caddy support and update security configurations 2 bulan lalu
.htaccess 4d8cc85754 feat: add Caddy support and update security configurations 2 bulan lalu
LICENSE af81380dc2 Initial commit 2 bulan lalu
README.md 4d8cc85754 feat: add Caddy support and update security configurations 2 bulan lalu
config.php 4d8cc85754 feat: add Caddy support and update security configurations 2 bulan lalu
db_init.php 4d8cc85754 feat: add Caddy support and update security configurations 2 bulan lalu
db_seed.php 4d8cc85754 feat: add Caddy support and update security configurations 2 bulan lalu
init.php 6ee52dc2d1 docs: update README with comprehensive project documentation 2 bulan lalu

README.md

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. 克隆项目并配置

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):

<VirtualHost *:80>
    ServerName bcjd.net
    DocumentRoot /var/www/html/bcjd-html/public

    <Directory /var/www/html/bcjd-html/public>
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

Caddy

由于 Caddy 的 root 指令会将网站根限制在 public/ 目录内,项目根目录下的敏感文件(config.phpinit.phpdb_*.phpsrc/ 等)天然无法被直接访问,无需额外配置路径拦截。

编辑 Caddyfile:

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,修改以下参数:

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 中的 get_seed_links() 数组即可,不需要修改 db_init.php

// db_seed.php - 修改后重新运行 db_init.php 即可
function get_seed_links(): array
{
    return [
        // 在这里添加/修改你的默认链接
    ];
}