一言難盡,Jpa這個功能差點讓我丟了工作

故事背景

前陣子,有位朋友在微信上問我數據被刪了能不能恢復,我問了下原因,居然是因爲一個配置項惹的禍。

故事細節

在 Spring Boot 中使用 jpa 來操作數據庫,jpa 就不做詳細的介紹了,相信大家都有所瞭解或者也用過。

在 jpa 中有一個配置項,可以讓程序在啓動的時候自動初始化表結構或者更新表結構的功能。聽上去很不錯,非常實用。

其實這是一個非常危險的功能,個人覺得不應該提供這種功能,只要留了口子就有可能會出問題。

這個配置就是:spring.jpa.hibernate.ddl-auto

  • create(危險係數 2 顆星

應用啓動的時候,如果數據庫中沒有對應的表,就會自動根據實體類的結構創建一個表結構。如果表已經存在了就會將表中的數據清空。

  • create-drop(危險係數 3 顆星

應用啓動的時候,如果數據庫中沒有對應的表,就會自動根據實體類的結構創建一個表結構。如果表已經存在了就會將表中的數據清空。

程序停止的時候會將數據庫中所有表刪除掉。

  • update(危險係數 1 顆星

應用啓動的時候,如果數據庫中沒有對應的表,就會自動根據實體類的結構創建一個表結構。如果表已經存在了就會判斷有沒有新增字段或者修改長度之類的,如果有則會更新表結構,不會影響數據。

  • validate(危險係數 0 顆星

validate 不會更新和刪除表或者數據,只會做驗證邏輯。

  • none (危險係數 0 顆星

禁用 ddl 操作。

如何防範

這種問題歸根到底還是技術負責人沒重視線上安全問題,主要有下面幾點:

  • 數據沒備份

線上數據一定要有備份,而且備份得放在不同的機器上,降低風險值。

  • 數據庫賬號權限細分,不給刪除權限,業務做邏輯刪除

如果公司有 DBA 那麼可能會好點,對數據庫相關的安全會管控的比較嚴。如果沒有 DBA,基本上都是開發自己管理,技術負責人應該去做這件事情。

一般的開發人員可以給只讀賬號就行了,偶爾線上查查數據之類的。

另外需要有一個讀寫的賬號,用於程序中。

像刪除,DDL 操作這種權限就留給管理員賬號就行了,不然很容易出事。

  • 應用中的框架有 DDL 操作的功能,一律禁止使用

這次的問題,除了開發人員的大意,最主要就是框架中自帶了 DDL 的功能。像這種功能就應該禁止使用。

所有的表結構應該在上線之前確認好,最好手動執行,像 DDL 這種操作本身就會鎖表,應該在業務低峯期去做。交給程序自動做不靠譜。

我記得我們之前在代碼中也有去自動創建表的邏輯,在 code review 的時候被指了出來,然後就去掉了。雖然說是爲了使用更方便,但是增加了線上數據庫的風險。像一些開源框架中也有類似的邏輯,當表不存在時會自動給你創建好表。

關於作者:尹吉歡,簡單的技術愛好者,《Spring Cloud 微服務-全棧技術與案例解析》, 《Spring Cloud 微服務 入門 實戰與進階》作者, 公衆號 猿天地 發起人。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章