Просмотр исходного кода

fix(S-cfc-310): teacher.family.overview 成员任务端点补跨家庭 memberId 归属校验(SC-T-13 数据隔离)

GuideFamilyTaskController.getFamilyMemberTasks 仅校验 requireBound(guideId, familyId),
未校验路径 memberId 是否属于该 familyId,已绑定家庭 A 的规划师传入属于家庭 B 的
memberId 即可跨家庭越权读取成员任务(IDOR)。补 selectById(memberId) 归属校验,
member 存在但 familyId 不匹配 → 403 拒绝,不进入 taskService。

TeacherFamilyOverviewContractTest RED 1(跨家庭 IDOR)→ GREEN 7/7;
GuideFamilyTaskControllerTest 全量 20/20 无回归。
Sisyphus 2 часов назад
Родитель
Сommit
b3b3c04759

+ 6 - 0
cfc-backend/src/main/java/com/etotem/cfc/controller/guide/GuideFamilyTaskController.java

@@ -268,6 +268,12 @@ public class GuideFamilyTaskController {
         Result<Void> denied = requireBound(guideId, familyId);
         if (denied != null) return Result.error(denied.getCode(), denied.getMessage());
 
+        // SC-T-13 数据隔离:memberId 必须属于路径 familyId,否则拒绝(防跨家庭 IDOR)
+        FamilyMember member = familyMemberMapper.selectById(memberId);
+        if (member != null && !familyId.equals(member.getFamilyId())) {
+            return Result.error(403, "成员不属于该家庭");
+        }
+
         Integer page = params != null && params.get("page") != null ? Integer.valueOf(params.get("page").toString()) : 1;
         Integer size = params != null && params.get("size") != null ? Integer.valueOf(params.get("size").toString()) : 10;
         String status = params != null && params.get("status") != null ? params.get("status").toString() : null;