From af7d3f65fd0d17f27ae4337eab6a06e66f98e0bb Mon Sep 17 00:00:00 2001 From: iven Date: Wed, 3 Jun 2026 01:08:00 +0800 Subject: [PATCH] =?UTF-8?q?fix(diary):=20=E4=BF=AE=E5=A4=8D=E6=97=A5?= =?UTF-8?q?=E8=AE=B0=E5=88=97=E8=A1=A8=20IDOR=20=E2=80=94=20=E9=9D=9E?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E8=A7=92=E8=89=B2=E5=8F=AA=E8=83=BD=E6=9F=A5?= =?UTF-8?q?=E7=9C=8B=E8=87=AA=E5=B7=B1=E7=9A=84=E6=97=A5=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - list_journals: 学生/家长等非管理角色强制 author_id = ctx.user_id - get_journal: 非管理角色查看他人日记返回 404(避免信息泄露) - 老师/管理员角色保留查看任意日记的能力(点评/管理需要) - 家长应通过 parent_service 专用端点查看孩子日记 审计 ID: S-07 --- .../erp-diary/src/handler/journal_handler.rs | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/crates/erp-diary/src/handler/journal_handler.rs b/crates/erp-diary/src/handler/journal_handler.rs index ebc6f77..278fa5a 100644 --- a/crates/erp-diary/src/handler/journal_handler.rs +++ b/crates/erp-diary/src/handler/journal_handler.rs @@ -105,6 +105,13 @@ where require_permission(&ctx, "diary.journal.read")?; let resp = JournalService::get_by_id(ctx.tenant_id, id, &state.db).await?; + + // IDOR 修复:非管理角色只能查看自己的日记 + if !ctx.roles.iter().any(|r| r == "teacher" || r == "admin") { + if resp.author_id != ctx.user_id { + return Err(AppError::NotFound(format!("日记 {} 不存在", id))); + } + } Ok(Json(ApiResponse::ok(resp))) } @@ -238,9 +245,21 @@ where let page = params.page.unwrap_or(1); let page_size = params.page_size.unwrap_or(20).min(100); + // IDOR 修复:非管理角色只能查看自己的日记 + // - 学生:强制 author_id = ctx.user_id + // - 老师/管理员:允许查看所有日记 + // - 家长:应通过 parent_service 专用端点查看孩子日记 + let author_id = if ctx.roles.iter().any(|r| r == "teacher" || r == "admin") { + // 管理角色可查看任意作者的日记 + params.author_id + } else { + // 学生/家长等非管理角色只能查看自己的日记 + Some(ctx.user_id) + }; + let (items, total) = JournalService::list( ctx.tenant_id, - params.author_id, + author_id, params.mood, params.date_from, params.date_to,