本卡屬 FR-078(母卡 CM-1602),修 N2(CM-1604)的 F4 與 F8,兩條都 3/3 全票通過。併一張卡(同性質:腳本內硬編憑證)。
🔴 這兩組密碼與那四把 API 金鑰不同——它們還沒有被撤銷、目前仍然有效。 決策者已被告知需更換。本卡處理的是程式碼層面(把硬編值改成環境變數);密碼本身的更換由決策者執行,不在本卡範圍。動手前先向首腦確認密碼是否已更換,兩者順序會影響手測怎麼做。
① POC 資料庫密碼寫死在文件產生腳本裡。任何能讀這個 repo 的人,拿著那組連線資訊就能直接連上 POC 資料庫。POC 等同 production(對外 demo/客戶試玩),這是繞過整個應用層授權直接讀寫客戶資料。
② blsadmin 管理員密碼寫死在三支腳本裡。拿到的人可以直接登入任何搆得到的環境、取得管理員權限。而管理員權限又能改 SMTP 設定——與本 arc 的 F1 串起來就是完整的攻擊鏈。
F4 — POC DB 密碼
docs/system-design/scripts/generate_db_schema_docx.py:34
DB_CONN = dict(host=..., port=25432, dbname="guidant_ai_poc",
user="cm_app", password="<硬編>")
F8 — blsadmin 密碼(三處)
scripts/e2e_test_module_frame_with_docx.py:38 TEST_PASS = "<硬編>" ← 無環境變數逃生門
scripts/migrate_2026-08-09_fr062_existing_tenant_licenses.py:80
SEED_PASS = os.getenv("FR062_SEED_PASS", "<硬編>") ← 有變數但 default 是真密碼
scripts/seed_2026-08-01_fr059_detection_profiles.py:65
SEED_PASS = os.getenv("FR059_SEED_PASS", "<硬編>") ← 同上
注意後兩處的形狀:它們「有」環境變數,但 default 直接寫真密碼——變數沒設時就靜默用真密碼,等於沒有防護還多一層誤導。
config/config.py 已有 DB_HOST / DB_NAME / DB_SECRET 等(見 CLAUDE.md「新增環境變數前必查既有變數」鐵則,FR-064 曾因自創同義變數出事)。優先沿用既有變數名,不要另創 POC_DB_PASSWORD 這種新名字。若既有變數語意不合(此腳本要連的是 POC 不是本機),回寫說明再決定。FR062_SEED_PASS / FR059_SEED_PASS 兩個名字加一處沒有變數。判斷該用一個共通名字還是各自保留,先 grep 確認有沒有別處在用這兩個變數名,再決定。.env.sample 補一行:新變數要在 .env.sample 登記(用途/必填與否,值留空)。這是 CLAUDE.md 的連帶規則。這幾支是一次性的維運/文件腳本,不屬「核心共用邏輯」,照 CLAUDE.md 測試政策不需要新增 unit test。驗證用手測即可。
generate_db_schema_docx.py 連的是 POC——只做唯讀的 schema 讀取,這屬 CLAUDE.md 環境異動鐵律的「讀」不是「寫」,允許執行。但不可對 POC 做任何寫入。