跳轉到

D-20260812-03|本機安全事件記錄與去識別匯出

背景與驅動力

既有規格定義了 500 筆 LocalSecurityLog,但 sanitize、P2P 驗章與 CSP 實際路徑尚未接入;若直接 保存任意 details,偵錯資料也可能帶入 payload、PeerId 或完整 URL。玩家需要可自行提供的安全 診斷資料,但本專案不應為此建立隱性 telemetry 或新的長期識別資料庫。

考慮過的選項

  • 遠端集中收集:診斷方便,但產生告知、同意、保存期限與資料外洩責任,棄。
  • 把完整事件先存本機、匯出時才遮蔽:仍會讓敏感資料在記憶體中長時間留存,且任何新讀取介面 都可能繞過遮蔽,棄。
  • 寫入時正面表列、記憶體有界保存、只允許玩家手動匯出版本化 JSON(採納)。

決定

  • browser bundle 使用單一 app-scope LocalSecurityLog,只存記憶體、上限 500 筆、重新整理清空, 不接持久化或遠端 transport。
  • sanitize Worker/editor admission、P2P canonical reject reason 與 CSP violation 接入同一記錄; pin/session 可沿既有事件 union 後續接入。
  • 每種事件在寫入時正面表列欄位。payload、signature、PeerId、未知欄位與 URL path/query/fragment 一律捨棄;CSP 網路 URL 最多保留 origin,其他只保留 scheme。讀取回傳 defensive copy。
  • 設定頁維護區提供玩家主動下載 { version: 1, events } UTF-8 JSON;不自動上傳,也不附加裝置、 帳號或其他診斷資訊。

後果與影響

安全拒絕與 CSP 問題具備可重現、可由玩家自行分享的最小診斷軌跡,同時敏感內容不會先被保存。 代價是重新整理後記錄消失,且刻意缺少完整 URL/payload 會降低少數問題的調查細節;若未來需要 更多欄位,必須逐事件評估並加入 allowlist,而不能恢復任意 details

本決策補實 D-20260703-01 的 CSP runtime 可觀測性,並補實 D-20260703-04 的 sanitize 拒收本機診斷;兩者的阻擋/ 拒收語意均未改變。