附件读取统一走 media.php 代理,真实地址不再暴露
无论附件存在本机 uploads/ 还是 OSS 私有桶,前台给浏览器的地址现在完全一致: media.php?k=<对象键>。界面上不再出现 uploads/ 真实路径,也不出现任何 bucket / endpoint / 签名痕迹。 - lib/attach.php:新增 fb_attach_proxy_url(),fb_attach_url() 与 fb_attach_thumb_url() 的本机分支一并改走代理(地址不落库、渲染现算, 对历史附件立即生效,无需迁移)。 - uploads/ 整目录禁止 Web 直读:附件只能经 media.php 出,真实物理路径 即便被猜到也取不到,同时绕不开 media.php 的可见性鉴权。 - 规则版本化自动升级:.htaccess 内埋 `# fb-local-guard: vN`, 旧版规则在任意请求时由 PHP(目录属主)整份重写。之所以不能靠部署覆盖: 部署账号对 uploads/ 无写权限,只有程序自己能改。 - 随包 uploads/.htaccess 改为程序产出的逐字节副本,并加断言防漂移 (否则线上会被自动升级覆盖,随包那份形同虚设)。 - 顺带修复真实源码泄漏:config.php.bak_<时间戳> 这类「非 .php 结尾、 但含源码」的备份文件此前可被公开下载。加固根 .htaccess: 去掉正则结尾锚点、补 .php[.\-_] 兜底、点名拒绝 config.php / oss.sts.php。 - media.php / upload.php / admin.php / README.md:文档与响应头同步。 验证:php -l 19 文件 0 失败;主回归 25/25、附件专项 22/22、安装向导 60/60、 统一代理渲染 7/7、反向验证 V1-V4 全被抓住;线上冒烟 30/30、 线上统一代理真机 13/13(OSS 私有桶 + 内网 endpoint 下上传→代理读回→ Range 206→伪造键 403)。
This commit is contained in:
@@ -12,8 +12,9 @@
|
||||
* ③ 只允许图片/视频白名单 MIME,且透传 Range 以支持视频拖动进度条。
|
||||
* ④ 全程流式转发,不把文件读进内存(memory_limit 小也安全)。
|
||||
*
|
||||
* 本机存储(local/...)的附件由 Web 服务器直接吐 uploads/ 下的文件,不走这里;
|
||||
* 但为兼容旧链接,这里也做一次本地回退。
|
||||
* 本机存储(local/...)与本文件的 OSS 分支【前台地址完全一致】:
|
||||
* 两种存储方式对外都只暴露 media.php?k=... —— 路径统一、真实地址不泄漏。
|
||||
* uploads/ 目录自身也被 .htaccess 全部拒绝,直连真实路径取不到东西。
|
||||
*/
|
||||
require __DIR__ . '/lib/bootstrap.php';
|
||||
|
||||
@@ -40,7 +41,8 @@ if ($process !== '') {
|
||||
}
|
||||
}
|
||||
|
||||
/* ---------------- 本机存储:直接读磁盘并流式输出 ---------------- */
|
||||
/* ---------------- 本机存储:直接读磁盘并流式输出 ----------------
|
||||
* 与前台的统一代理地址配套:local 附件也走这里,uploads/ 目录本身禁止直连。 */
|
||||
if (fb_attach_is_local($key)) {
|
||||
// 先鉴权再探文件,避免用 404/403 差异被探测对象是否存在
|
||||
if (!fb_media_authorized($key)) { fb_media_fail(403, '无权访问该附件'); }
|
||||
@@ -53,6 +55,7 @@ if (fb_attach_is_local($key)) {
|
||||
header('Content-Length: ' . $size);
|
||||
header('Accept-Ranges: bytes');
|
||||
header('Cache-Control: public, max-age=86400');
|
||||
header('X-Content-Type-Options: nosniff'); // 与 OSS 分支保持一致
|
||||
fb_media_send_local($path, $size);
|
||||
exit;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user