本卡屬 FR-096(母卡 CM-1803),第 3 棒(收尾):選單字典表的完整路徑(jedi-system-core 套件,33 檔 842 行,其中 13 支是空的 __init__.py)。只掃不修

這一棒在做什麼(白話)

掃「選單字典」這張表從端點到資料庫的完整路徑。這張表存的是前端下拉選單的選項文字(例如使用者狀態有哪幾種、問卷題型有哪幾種),是全站 UI 共用的一本字典。

要回答兩個問題:① 誰改得動這本字典? ② 一個客戶改一筆,是不是就改到全站所有客戶了?

為什麼切這一塊

風險最低的一棒,但不跑完就不能說這支套件掃過了。 表的內容已查證無個資(見下段),所以看的不是「資料會不會外洩」,而是**「完整性」——這張表沒有客戶隔離、(分組,鍵) 全域唯一,任一客戶改一筆等於改到全站的 UI。改掉一個選項的文字不致命,但改掉一個鍵**可能讓某個頁面對不到值而壞掉,或把一個停用的選項打開。

這是合理的停損點之後——第 1 棒(設定表,密碼在那)+第 2 棒(主專案接線,權限在那)跑完已涵蓋全部的密碼與權限風險面。這一棒是為了覆蓋率完整。

🔴 已經查證過的事——掃到不要當發現報

system_menus 這張表沒有隔離,是正確的,不是漏洞。 首腦 2026-09-15 對 DEV 實查:rls=false0 條規則、共 74 筆,內容全是下拉選單的碼表(USER_STATUS/ENABLE_STATUS/ANS_TYPE 這類),沒有客戶資料、沒有個資。選單字典是全站 UI 的資料來源,隔離起來會壞掉所有頁面。套件 plugin/__init__.py 的說明也寫明兩張表的租戶語意刻意相反:「設定是每個客戶自己的參數,選單是全站共用的字典」。報「這張表沒有隔離」=重報已知事實,不算發現。

但有一件相關的事要記一句:查選單的請求格式(api/serializers/system_menu.py:25-31SystemMenuQueryRequest)六個欄位全部非必填,送一個空的查詢條件就會回全表。以這張表的內容而言影響有限,但它屬於首腦正在盤的「共用底層送空條件就回全表」那條線(跨 arc 總表 §6 A 組第 15 項,已經是第三次撞到)。報告裡寫一句、標明歸那條線即可,不要當獨立發現升級成中高風險。

重點看什麼

首腦 2026-09-15 讀過這一半的程式碼,以下是值得從這裡往外追的:

本棒範圍(33 檔,逐檔列;其中 13 支是空的 __init__.py

jedi_system_core/api/routes/system_menu_route.py
jedi_system_core/api/serializers/__init__.py
jedi_system_core/api/serializers/_shared.py
jedi_system_core/api/serializers/system_menu.py
jedi_system_core/app/__init__.py
jedi_system_core/app/dto/__init__.py
jedi_system_core/app/dto/base_dto.py
jedi_system_core/app/dto/system_menu.py
jedi_system_core/app/service/system_menu_service.py
jedi_system_core/common/__init__.py
jedi_system_core/common/enum/__init__.py
jedi_system_core/common/enum/code.py
jedi_system_core/common/enum/error_code.py
jedi_system_core/common/enum/event_code.py
jedi_system_core/common/utils/__init__.py
jedi_system_core/common/utils/common_util.py
jedi_system_core/domain/__init__.py
jedi_system_core/domain/entities/__init__.py
jedi_system_core/domain/entities/system_menu_entity.py
jedi_system_core/domain/entities/system_menu_query_entity.py
jedi_system_core/domain/repository/__init__.py
jedi_system_core/domain/repository/system_menu_repo.py
jedi_system_core/domain/service/__init__.py
jedi_system_core/domain/service/system_menu_domain_service.py
jedi_system_core/infra/__init__.py
jedi_system_core/infra/mapper/__init__.py
jedi_system_core/infra/mapper/system_menu_mapper.py
jedi_system_core/infra/models/__init__.py
jedi_system_core/infra/models/system_menu.py
jedi_system_core/infra/repository/__init__.py
jedi_system_core/infra/repository/system_menu_repo_impl.py
jedi_system_core/migrations/004-system-menus-seed.sql
jedi_system_core/migrations/005-system-core-ui-routes.sql