不會SQL注入,連漫畫都看不懂了

原文:數據安全不可不防!三分鐘了解何謂SQL注入 - 集智專欄

作者:朝陽

XKCD漫畫

xkcd漫畫是由蘭道爾·門羅(Randall Munroe)創作的系列網路漫畫。他曾在NASA工作,製造機器人。2006年成為全職網路漫畫家,是美國熱門科普漫畫網站xkcd的創立者。大抵是位《生活大爆炸》里Howard式的人物。

由於職業背景的原因,xkcd漫畫經常關注科技、網路等問題,所以在果殼網、科學松鼠會等媒體上經常被引用,他們的讀者想必對這個畫風不會陌生。

類似的,在IT問答社區StackOverflow上也有大波的xkcd漫畫擁躉,有人根據SO開放的數據找出了最受程序員歡迎的5篇:

Top 5 XKCD comics which can illustrate programming questions

其中人氣最高的就是下面這篇:

這篇漫畫講的其實就是一個SQL注入。

何謂SQL注入?

SQL注入是一種非常常見的資料庫攻擊手段,SQL注入漏洞也是網路世界中最普遍的漏洞之一。大家也許都聽過某某學長通過攻擊學校資料庫修改自己成績的事情,這些學長們一般用的就是SQL注入方法。

SQL注入其實就是惡意用戶通過在表單中填寫包含SQL關鍵字的數據來使資料庫執行非常規代碼的過程。簡單來說,就是數據「越俎代庖」做了代碼才能幹的事情。這個問題的來源是,SQL資料庫的操作是通過SQL語句來執行的,而無論是執行代碼還是數據項都必須寫在SQL語句之中,這就導致如果我們在數據項中加入了某些SQL語句關鍵字(比如說SELECT、DROP等等),這些關鍵字就很可能在資料庫寫入或讀取數據時得到執行。

多言無益,我們拿真實的案例來說話。下面我們先使用SQLite建立一個學生檔案表。

那麼SQL注入又是怎麼一回事呢?我們嘗試再插入一條惡意數據,數據內容就是漫畫中的

"Robert");DROP TABLE students;--"

看看會發生什麼情況。

這是為什麼呢?問題就在於我們所插入的數據項中包含SQL關鍵字DROP TABLE,這兩個關鍵字的意義是從資料庫中清除一個表單。而關鍵字之前的Robert");使得SQL執行器認為上一命令已經結束,從而使得危險指令DROP TABLE得到執行。也就是說,這段包含DROP TABLE關鍵字的數據項使得原有的簡單的插入姓名信息的SQL語句

"INSERT INTO students (name) VALUES ("Robert")"

變為了同時包含另外一條清除表單命令的語句

"INSERT INTO students (name) VALUES ("Robert");DROP TABLE students;--"

而SQL資料庫執行上述操作後,students表單被清除,因而表單無法找到,所有數據項丟失。

如何防止SQL注入問題

大家也許都想到了,注入問題都是因為執行了數據項中的SQL關鍵字,那麼,只要檢查數據項中是否存在SQL關鍵字不就可以了么?的確是這樣,很多資料庫管理系統都是採取了這種看似『方便快捷』的過濾手法,但是這並不是一種根本上的解決辦法,如果有個美國人真的就叫做『Drop Table』呢?你總不能逼人家改名字吧。

合理的防護辦法有很多。首先,盡量避免使用常見的資料庫名和資料庫結構。在上面的案例中,如果表單名字並不是students,則注入代碼將會在執行過程中報錯,也就不會發生數據丟失的情況——SQL注入並不像大家想像得那麼簡單,它需要攻擊者本身對於資料庫的結構有足夠的了解才能成功,因而在構建資料庫時盡量使用較為複雜的結構和命名方式將會極大地減少被成功攻擊的概率。

使用正則表達式等字元串過濾手段限制數據項的格式、字元數目等也是一種很好的防護措施。理論上,只要避免數據項中存在引號、分號等特殊字元就能很大程度上避免SQL注入的發生。

另外,就是使用各類程序文檔所推薦的資料庫操作方式來執行數據項的查詢與寫入操作,比如在上述的案例中,如果我們稍加修改,首先使用execute()方法來保證每次執行僅能執行一條語句,然後將數據項以參數的方式與SQL執行語句分離開來,就可以完全避免SQL注入的問題,如下所示:

而對於PHP而言,則可以通過mysql_real_escape_string等方法對SQL關鍵字進行轉義,必要時審查數據項目是否安全來防治SQL注入。

當然,做好資料庫的備份,同時對敏感內容進行加密永遠是最重要的。某些安全性問題可能永遠不會有完美的解決方案,只有我們做好最基本的防護措施,才能在發生問題的時候亡羊補牢,保證最小程度的損失。

關於以上案例,有興趣的同學可進一步參閱:SQL injection with python


推薦閱讀:

黑客技術/信息安全/網路安全如何從零學起?(最後更新2018-01-10)
為什麼radare2普及度不及ida,作為開源工具它有什麼值得改進的地方嗎?
現在優秀信息安全的公司招實習生標準是什麼?

TAG:漫画 | SQL | 信息安全 |