fix(安全/性能): AI审查实证修复 - metalinkUrl SSRF校验 + withTimeout定时器泄漏 + 批量更新/初始加载守卫

- install-manager.ts: queue-install 增加 metalinkUrl 校验(仅允许相对路径或官方域名,防 SSRF)
- App.vue: withTimeout 用 finally(clearTimeout) 修复定时器泄漏
- App.vue: apps 批量更新改数组赋值替代 push(...),避免逐元素响应式重渲染
- App.vue: apps.length watcher 增加 initialCatalogLoaded 守卫,初始目录加载期间跳过已安装列表刷新 IPC
- 审计实证:①filename校验已有(误报) ④pauseDownload为历史TODO且后端不支持(不在此PR) ⑦⑧为可维护性大项(记录待后续)

注:AI审查4阻断项实证——①误报 ②真实加固 ③真实修复 ④历史遗留;4改进项 ⑤⑥真实已修 ⑦⑧记录
This commit is contained in:
xiyidaiwa
2026-08-12 20:28:27 +08:00
parent 30e1bc4840
commit a7b8cd52af
2 changed files with 28 additions and 7 deletions
+14
View File
@@ -313,6 +313,20 @@ ipcMain.on("queue-install", async (event, download_json) => {
return;
}
// metalinkUrl 来自渲染端(由目录 filename / 主进程解析的 downloadUrl 拼成)。
// 纵深防御:仅允许相对路径(拼接 baseURL)或以官方域名开头的绝对 URL,
// 拒绝任意外部地址,防止 axios 忽略 baseURL 发起 SSRF/任意源下载。
if (metalinkUrl) {
const isRelative = metalinkUrl.startsWith("/");
const isOfficial = metalinkUrl.startsWith(
"https://erotica.spark-app.store",
);
if (!isRelative && !isOfficial) {
logger.warn(`queue-install invalid metalinkUrl: ${metalinkUrl}`);
return;
}
}
logger.info(`收到下载任务: ${id}, 软件包名称: ${pkgname}, 来源: ${origin}`);
const webContents = event.sender;