新聞中心
故事背景
前陣子,有位朋友在微信上問我數(shù)據(jù)被刪了能不能恢復(fù),我問了下原因,居然是因?yàn)橐粋€(gè)配置項(xiàng)惹的禍。

為撫松等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及撫松網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站制作、網(wǎng)站建設(shè)、撫松網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
故事細(xì)節(jié)
在 Spring Boot 中使用 jpa 來操作數(shù)據(jù)庫(kù),jpa 就不做詳細(xì)的介紹了,相信大家都有所了解或者也用過。
在 jpa 中有一個(gè)配置項(xiàng),可以讓程序在啟動(dòng)的時(shí)候自動(dòng)初始化表結(jié)構(gòu)或者更新表結(jié)構(gòu)的功能。聽上去很不錯(cuò),非常實(shí)用。
其實(shí)這是一個(gè)非常危險(xiǎn)的功能,個(gè)人覺得不應(yīng)該提供這種功能,只要留了口子就有可能會(huì)出問題。
這個(gè)配置就是: spring.jpa.hibernate.ddl-auto
- create( 危險(xiǎn)系數(shù) 2 顆星 )
應(yīng)用啟動(dòng)的時(shí)候,如果數(shù)據(jù)庫(kù)中沒有對(duì)應(yīng)的表,就會(huì)自動(dòng)根據(jù)實(shí)體類的結(jié)構(gòu)創(chuàng)建一個(gè)表結(jié)構(gòu)。如果表已經(jīng)存在了就會(huì)將表中的數(shù)據(jù)清空。
- create-drop( 危險(xiǎn)系數(shù) 3 顆星 )
應(yīng)用啟動(dòng)的時(shí)候,如果數(shù)據(jù)庫(kù)中沒有對(duì)應(yīng)的表,就會(huì)自動(dòng)根據(jù)實(shí)體類的結(jié)構(gòu)創(chuàng)建一個(gè)表結(jié)構(gòu)。如果表已經(jīng)存在了就會(huì)將表中的數(shù)據(jù)清空。
程序停止的時(shí)候會(huì)將數(shù)據(jù)庫(kù)中所有表刪除掉。
- update( 危險(xiǎn)系數(shù) 1 顆星 )
應(yīng)用啟動(dòng)的時(shí)候,如果數(shù)據(jù)庫(kù)中沒有對(duì)應(yīng)的表,就會(huì)自動(dòng)根據(jù)實(shí)體類的結(jié)構(gòu)創(chuàng)建一個(gè)表結(jié)構(gòu)。如果表已經(jīng)存在了就會(huì)判斷有沒有新增字段或者修改長(zhǎng)度之類的,如果有則會(huì)更新表結(jié)構(gòu),不會(huì)影響數(shù)據(jù)。
- validate( 危險(xiǎn)系數(shù) 0 顆星 )
validate 不會(huì)更新和刪除表或者數(shù)據(jù),只會(huì)做驗(yàn)證邏輯。
- none ( 危險(xiǎn)系數(shù) 0 顆星 )
禁用 ddl 操作。
如何防范
這種問題歸根到底還是技術(shù)負(fù)責(zé)人沒重視線上安全問題,主要有下面幾點(diǎn):
- 數(shù)據(jù)沒備份
線上數(shù)據(jù)一定要有備份,而且備份得放在不同的機(jī)器上,降低風(fēng)險(xiǎn)值。
- 數(shù)據(jù)庫(kù)賬號(hào)權(quán)限細(xì)分,不給刪除權(quán)限,業(yè)務(wù)做邏輯刪除
如果公司有 DBA 那么可能會(huì)好點(diǎn),對(duì)數(shù)據(jù)庫(kù)相關(guān)的安全會(huì)管控的比較嚴(yán)。如果沒有 DBA,基本上都是開發(fā)自己管理,技術(shù)負(fù)責(zé)人應(yīng)該去做這件事情。
一般的開發(fā)人員可以給只讀賬號(hào)就行了,偶爾線上查查數(shù)據(jù)之類的。
另外需要有一個(gè)讀寫的賬號(hào),用于程序中。
像刪除,DDL 操作這種權(quán)限就留給管理員賬號(hào)就行了,不然很容易出事。
- 應(yīng)用中的框架有 DDL 操作的功能,一律禁止使用
這次的問題,除了開發(fā)人員的大意,最主要就是框架中自帶了 DDL 的功能。像這種功能就應(yīng)該禁止使用。
所有的表結(jié)構(gòu)應(yīng)該在上線之前確認(rèn)好,最好手動(dòng)執(zhí)行,像 DDL 這種操作本身就會(huì)鎖表,應(yīng)該在業(yè)務(wù)低峰期去做。交給程序自動(dòng)做不靠譜。
我記得我們之前在代碼中也有去自動(dòng)創(chuàng)建表的邏輯,在 code review 的時(shí)候被指了出來,然后就去掉了。雖然說是為了使用更方便,但是增加了線上數(shù)據(jù)庫(kù)的風(fēng)險(xiǎn)。像一些開源框架中也有類似的邏輯,當(dāng)表不存在時(shí)會(huì)自動(dòng)給你創(chuàng)建好表。
名稱欄目:一言難盡,Jpa這個(gè)功能差點(diǎn)讓我丟了工作
當(dāng)前鏈接:http://m.fisionsoft.com.cn/article/coiesdj.html


咨詢
建站咨詢
