Repository navigation
v1.49.0 — 欄位遮罩涵蓋攤平與陣列列,且不再為每條規則掃過整個結果集
延續 1.48.0 的 blacklist 主題:那一版修的是「哪些物件受保護」,這一版修的是受保護的欄位到底有沒有真的被遮掉,以及遮罩本身的成本。兩條安全性修復都屬於 fail-open —— 資料原樣回傳,其中一條連安全通知都不會發。
Security
- 黑名單指定父欄位時,攤平後的子欄位未被遮蔽,而且不發通知。 Elasticsearch adapter 會把
_source遞迴攤平成帶點的頂層鍵({profile:{ssn}}→ 鍵profile.ssn,文件裡根本沒有profile),而遮蔽判斷是欄位名等值比對,因此把profile列入黑名單完全沒有作用。因為「已遮蔽欄位」清單是空的,連安全通知都不會發出。影響query/q/export三條 Elasticsearch 路徑。(#30) - 欄位遮罩把「列本身是陣列」當成 record,遮蔽通知發了但資料沒被拿掉。 判斷「欄位在不在」的
readPath把陣列當透明容器往裡面找,實際執行遮蔽的cloneRecord卻當成 record —— 一列被回報為已遮蔽,卻是完整回傳的。目前沒有任何 adapter 會回傳陣列列。(#31)
Added
dbcli proxy analyze各區塊行動化。errors[]附dbcli schema <table>與「先核對表名欄名再修、勿臆測」的 hints;repetition[]附explain/guide missing-index-for與 N+1 批次化建議。text 版彙整成SUGGESTED COMMANDS/HINTS區段。(#33)
Performance
- 遮罩層不再為每條黑名單規則掃過整個結果集。 掃不到表名的 fail-safe 分支會套上設定裡的每一條規則,「規則多、命中少」是它的常態形狀:60 條帶點且完全不命中的規則對上 1000 列量到 12.10ms,而真正遮掉的只有一個欄位。現在無點的規則由既有欄位集合精確回答,帶點的規則只在頭鍵真的持有物件或陣列時才走訪列。12.10ms → 0.70ms,一般查詢的遮罩 0.69 → 0.53ms。(#31)
- 欄位遮罩每列只複製一次,不再每個路徑一次。 30.37ms → 1.73ms。
Changed / Fixed
- 效能基準改為阻擋 CI:
continue-on-error: true是兩條基準能失敗四個月沒人發現的原因。每條基準改取多次量測的中位數並印出實測值,預算依實際 runner 重訂。 ConcurrentLockManager逾時測試去 flake(Windows 偶發紅,且原本的斷言在某些情況下會安靜空跑)。(#32)
驗證:release:check 9/9 通過,4010 tests pass,CI 14/14 綠。
npm 套件 @carllee1983/dbcli 由維護者手動發布。