簡單來說,SQL註入是使用代碼漏洞來獲取網站或應用程序後臺的SQL數據庫中的數據,進而可以取得數據庫的訪問權限。比如,黑客可以利用網站代碼的漏洞,使用SQL註入的方式取得壹個公司網站後臺數據庫裏所有的數據信息。拿到數據庫管理員登錄用戶名和密碼後黑客可以自由修改數據庫中的內容甚至刪除該數據庫。SQL註入也可以用來檢驗壹個網站或應用的安全性。SQL註入的方式有很多種,但本文將只討論最基本的原理,我們將以PHP和MySQL為例。本文的例子很簡單,如果妳使用其它語言理解起來也不會有難度,重點關註SQL命令即可。
壹個簡單的SQL註入攻擊案例
假如我們有壹個公司網站,在網站的後臺數據庫中保存了所有的客戶數據等重要信息。假如網站登錄頁面的代碼中有這樣壹條命令來讀取用戶信息。
$q = "SELECT `id` FROM `users` WHERE `username`= ' " .$_GET['username']. " ' AND `password`= ' " .$_GET['password']. " ' ";?>現在有壹個黑客想攻擊妳的數據庫,他會嘗試在此登錄頁面的用戶名的輸入框中輸入以下代碼:
' ; SHOW TABLES;
點擊登陸鍵,這個頁面就會顯示出數據庫中的所有表。如果他現在使用下面這行命令:
'; DROP TABLE [table name];
這樣他就把壹張表刪除了!
防範SQL註入 - 使用mysql_real_escape_string()函數
在數據庫操作的代碼中用這個函數mysql_real_escape_string()可以將代碼中特殊字符過濾掉,如引號等。如下例:
$q = "SELECT `id` FROM `users` WHERE `username`= ' " .mysql_real_escape_string( $_GET['username'] ). " ' AND `password`= ' " .mysql_real_escape_string( $_GET['password'] ). " ' ";?>防範SQL註入 - 使用mysql_query()函數
mysql_query()的特別是它將只執行SQL代碼的第壹條,而後面的並不會執行。回想在最前面的例子中,黑客通過代碼來例後臺執行了多條SQL命令,顯示出了所有表的名稱。所以mysql_query()函數可以取到進壹步保護的作用。我們進壹步演化剛才的代碼就得到了下面的代碼:
//connection
$database = mysql_connect("localhost", "username","password");
//db selection
$q = mysql_query("SELECT `id` FROM `users` WHERE `username`= ' " .mysql_real_escape_string( $_GET['username'] ). " ' AND `password`= ' " .mysql_real_escape_string( $_GET['password'] ). " ' ", $database);?>除此之外,我們還可以在PHP代碼中判斷輸入值的長度,或者專門用壹個函數來檢查輸入的值。所以在接受用戶輸入值的地方壹定要做好輸入內容的過濾和檢查。當然學習和了解最新的SQL註入方式也非常重要,這樣才能做到有目的的防範。如果使用的是平臺式的網站系統如Wordpress,要註意及時打上官方的補丁或升級到新的版本。