data/uploads 改为由 PHP 自动创建并自补防护,不依赖部署账号建目录 (#1)
## 问题 部署时用 btops 建 data/ 与 uploads/,属主成了 btops:btops,Web 用户 www 写不进去, 安装向导直接报「目录不可写」,还得请人用 root 手工 chown —— 这不该让用户干。 ## 修法:让 PHP 自己建 PHP 以 Web 用户身份运行,它建出来的目录属主天生就是 www,不需要任何 chown。 - 部署脚本不再创建 data/ uploads/(只建 assets/ lib/) - 首次访问时 fb_db_init() 自动 mkdir data/,并立刻补防护文件 - uploads/ 由 fb_local_ensure_dir() 同样自动建 + 补防护 - 安装向导的环境体检 mkdir 之后也立刻补防护,不留空窗期 ## 新增 data/ 防护文件自动生成 原先只有 uploads/ 有自动防护,data/ 没有 —— 数据库目录裸奔。 新增 fb_db_ensure_guard(),写 .htaccess(拒绝直读,禁 db/db-wal/db-shm/sqlite/php) + index.html 占位,带 `# fb-data-guard: vN` 版本标记,规则升级时整份重写。 ## 顺带确认 站点根 .htaccess 已有全局兜底(拒绝 .db/.log/.md/.bak 等直读 + Options -Indexes), 即使某个目录暂时缺 .htaccess,/data/ 和 /data/feedback.db 也是 403。 现在是双保险,不依赖单点。 验证(WSL 真实环境): - 全新安装 33/33、老基线 25/25、附件专项 22/22、安装向导 60/60 - data/ 与 uploads/ 均由 PHP 自动创建,属主即运行用户 - 两者 .htaccess 自动生成并带正确版本标记(v1 / v2)
This commit is contained in:
@@ -78,6 +78,14 @@ function fb_install_checks() {
|
||||
|
||||
foreach ($dirs as $d => $why) {
|
||||
if (!is_dir($d)) { @mkdir($d, 0755, true); }
|
||||
// 目录一建好就立刻补防护文件,不留"目录存在但无防护"的空窗期。
|
||||
// data/ 用 fb_db_ensure_guard(),uploads/ 用 fb_local_ensure_dir(),
|
||||
// 两者都在被保护目录里写 .htaccess + index.html。
|
||||
if (basename($d) === 'data' && function_exists('fb_db_ensure_guard')) {
|
||||
fb_db_ensure_guard($d);
|
||||
} elseif (basename($d) === 'uploads' && function_exists('fb_local_ensure_dir')) {
|
||||
fb_local_ensure_dir();
|
||||
}
|
||||
$w = is_dir($d) && is_writable($d);
|
||||
if (!$w) { $ok = false; }
|
||||
$shown = ($d === FB_ROOT) ? '(站点根)' : str_replace(FB_ROOT, '', $d);
|
||||
|
||||
Reference in New Issue
Block a user