From acc8446a661078179c8d35019c70840ed03cf7bb Mon Sep 17 00:00:00 2001 From: PIKACHUIM Date: Sun, 20 Sep 2026 14:36:27 +0800 Subject: [PATCH 1/6] =?UTF-8?q?fix(sign):=20/fs/get=20raw=5Furl=20?= =?UTF-8?q?=E7=BC=BA=E5=B0=91=E4=B8=8B=E8=BD=BD=E7=AD=BE=E5=90=8D=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E4=B8=8B=E8=BD=BD=20401=20(#66)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 预览页的下载按钮直接使用 /api/fs/get 返回的 raw_url(),图片/视频预览也直接把它当 src,前端不会再自己拼 ?sign=。而 raw_url 指向需要验签的 /p 端点,sign_all / 存储级 enable_sign / 密码 meta 任一命中时缺签名必然 401 sign verify failed:表现为预览页正常、点下载就 401(.exe 这类无内容预览的文件尤其明显)。 对齐 Go handles.FsGet:需要签名时把 ?sign= 追加到 raw_url。同时把 raw.ts buildDownProxyUrl 的补签条件从只看 sign_all 改为 needDownloadSign,与验签侧一致,避免只靠 enable_sign/密码 meta 的部署被 302 到无签名的地址。 新增回归测试 fs_get_rawurl_sign.test.ts:真实 Local 存储 + sign_all,校验 raw_url 带签名、签名可通过验签、直接请求 raw_url 不再 401,并附篡改签名必 401 的对照。 --- src/backend/server/fs.ts | 20 ++- src/backend/server/fs_get_rawurl_sign.test.ts | 169 ++++++++++++++++++ src/backend/server/raw.ts | 8 +- 3 files changed, 193 insertions(+), 4 deletions(-) create mode 100644 src/backend/server/fs_get_rawurl_sign.test.ts diff --git a/src/backend/server/fs.ts b/src/backend/server/fs.ts index f0a7a3ac..479a482c 100644 --- a/src/backend/server/fs.ts +++ b/src/backend/server/fs.ts @@ -555,6 +555,24 @@ fsRouter.post("/get", async (c) => { signPolicy.expiresIn || (await getSignExpiresIn(c)), ) : "" + // raw_url 必须自带签名(Issue #66)。 + // + // 前端把本接口的 raw_url 直接当下载地址使用:预览页的「下载」按钮就是 + // (pages/home/previews/download.tsx),图片/视频预览也 + // 直接把它塞进 /(previews/download.tsx) + * - 图片/视频预览: / ` | **不会** | 需要签名时 401 | +| 图片 / 视频 / PDF 预览 | `/` | **不会** | 需要签名时 401 | -| 图片 / 视频 / PDF 预览 | `/(pages/home/previews/download.tsx),图片/视频预览也 // 直接把它塞进 /