fix(assets): 诊断接口改用 /projects/{projectId}/asset-diagnosis 路径 #1575
Reference in New Issue
Block a user
Delete Branch "fix/diagnosis-project-id"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
修复内容
后端诊断路由实际注册在
GET /projects/{project_id}/asset-diagnosis,但前端调用的是/asset-diagnosis(缺少 project_id 路径参数),导致接口 404。改动
apps/web/src/api/assets/diagnosis.tsgetAssetDiagnosis(assetId?, projectId?)增加可选projectId参数/asset-diagnosis改为/projects/${pid}/asset-diagnosisprojectId未传时自动通过getOrCreateDefaultProject()获取(与libraries.ts、upload.ts保持一致)apps/web/src/pages/assets/hooks/asset-operations/useSingleOperations.tshandleDiagnose调用getAssetDiagnosis(asset.id)时 projectId 走内部 fallback- getAssetDiagnosis 增加可选 projectId 参数 - 调用路径从 /asset-diagnosis 改为 /projects/{pid}/asset-diagnosis - projectId 未传时自动通过 getOrCreateDefaultProject() 获取 - 与后端路由 GET /projects/{project_id}/asset-diagnosis 对齐🚀 预览环境已部署
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
[apps/web/src/api/assets/diagnosis.ts: 15] 路径遍历安全风险
pid直接被插入到 URL 路径字符串中/projects/${pid}/asset-diagnosis。如果projectId参数来源于用户输入且未经过严格的格式校验(例如是否为有效的 UUID 或数字 ID),攻击者可以传入包含../的字符串(如../../admin),导致访问到非预期的 API 端点,造成信息泄露或权限绕过。projectId构造 URL 前,必须对其进行格式校验(如正则匹配),确保其为合法的项目标识符;或者由apiClient在底层对路径参数进行自动转义。[apps/web/src/api/assets/diagnosis.ts: 12] 空指针引用风险
(await getOrCreateDefaultProject()).id。如果getOrCreateDefaultProject函数在特定情况下(如用户未登录、网络错误或后端异常)返回null或undefined,此处将抛出 "Cannot read properties of undefined" 运行时错误,导致程序崩溃。getOrCreateDefaultProject的类型定义明确为非空,并在其内部处理失败逻辑(抛出明确异常而非返回 null)。💡 改进建议(不阻塞合并)
[apps/web/src/api/assets/diagnosis.ts: 12] 副作用风险
getAssetDiagnosis(通常被视为只读操作),但其内部调用了getOrCreateDefaultProject。如果该函数包含 "Create" 逻辑(即当默认项目不存在时创建一个),则在诊断接口中引入了写操作副作用。这违反了 HTTP GET 语义的幂等性原则,可能导致意外的数据创建或权限问题。建议确认 "Create" 逻辑是否必要,或将其移至更上层的业务逻辑中。[apps/web/src/api/assets/diagnosis.ts: 12] 变量命名可读性
pid过于简短,虽然在此处上下文清晰,但使用resolvedProjectId或targetProjectId能提高代码的可维护性和可读性。✅ 良好实践
??) 来处理可选参数projectId,提供了默认回退逻辑,代码简洁。params对象的构建逻辑,确保了向后兼容性。🤖 由 AI 代码审查机器人自动生成 | 2026-08-31 07:35:45 | 模型:
CI全绿,自动审批通过。
CI全绿,自动审批通过。
🗑️ 预览环境已清理
PR #1575 已关闭或合并,对应的预览环境已被清理。