資料庫之淚第一章節

xuexiaogang發表於2022-05-24

    幸福的家庭似乎都一樣的美好無可挑剔,不幸福的家庭總是有各種各樣的不和諧,各種各樣的災難或痛苦。 出處:俄國 列夫·托爾斯泰 《安娜·卡列尼娜》第一章第一句話。

    解析:列夫·托爾斯泰的這句“幸福的家庭都是相似的,不幸的家庭各有各的不幸”和中國的俗語“家家有本難唸的經”有異曲同工之妙。每一個家裡都有一些旁人不為所知的難事,每個家庭都有別人所不同的煩惱。看著貌似很幸福的家庭,也有自己的煩惱事,只不過沒有說出來而已。

   有一次我在我的群裡說這話時候信通院的劉老師說可以寫個專題。今天先開個頭吧。 計算機是二進位制的,只認識 0和1,連2都不認識。所以很多時候是真假的判斷。資料庫也是計算機的一個分支,也不例外。

一般開發寫SQL,select * from t where 1=1.這是為了後續增加條件 and t.id=1這樣的繼續往後新增。

1、如果單獨1=1這樣是恆等於真所以這樣是全表查詢。這種是有意而為之。

2、如果 select * from t where t.id=1 or 1=1 ,由於or是或的關係,而1=1又是恆為真,又是全表。而這個就是SQL隱碼攻擊的一個典型體現。

3、如果select * from t where t.id>1,那麼也是恆為真,返回所有符合條件的。只不過是id大約1的幾乎是所有的,如果有一億條資料,那麼就是返回1億資料。

4、如果select * from t where t.id!=1,那麼也是恆為真,返回所有符合條件的。同上。

以上可能還算常見, 接下來可能就是大家沒見過的。

5、如果select * from t where  1-1 and 其他條件。說真的我第一次見到1-1.這是什麼操作?後來想想,想通了,鍵盤上=和-是挨著的,開發不仔細,本來是想1=1結果變成了1-1.那麼就是select * from t where  0

資料庫之淚第一章節

0代表為假。所以全部不顯示。而這種不報錯的是可以執行的,只是執行了個寂寞。


6、由於疏忽漏寫,基於剛才的大家知道select * from t where 1是全部,0是什麼都不做。

那麼如果本來想 update t set name='1' where id=1;結果寫錯了update t set name='1' where 1呢?

期望是下面的圖。

資料庫之淚第一章節


漏寫了id=1,而執行就變成了這樣。

資料庫之淚第一章節

這個時候就希望是Oracle吧。還能給你用閃回找回。其他資料庫指望備份也不可能恢復出錯之前,還需要一些工作量,甚至較大的工作量。如果這個表有幾千萬上億。那真的就呵呵了。


5和6是我們不常見的問題,但是隻有你想不到的,沒有開發做不到的。這就是資料庫流下的淚水。




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/637517/viewspace-2896635/,如需轉載,請註明出處,否則將追究法律責任。

相關文章