Skip to content

v1.49.0 — 欄位遮罩涵蓋攤平與陣列列,且不再為每條規則掃過整個結果集

Choose a tag to compare

@CarlLee1983 CarlLee1983 released this 06 Aug 08:56
· 559 commits to main since this release
71e7a0b

延續 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 由維護者手動發布。