簡單來說,SQL註入就是利用代碼漏洞,在網站或應用的後臺獲取SQL數據庫中的數據,然後獲取數據庫的訪問權限。例如,黑客可以利用網站代碼中的漏洞,利用SQL註入獲取某公司網站後臺數據庫中的所有數據信息。黑客在獲得數據庫管理員的登錄用戶名和密碼後,可以隨意修改數據庫的內容,甚至刪除數據庫。SQL註入還可以用來檢查網站或應用程序的安全性。註入SQL的方法有很多,但本文只討論最基本的原理,我們以PHP和MySQL為例。本文中的例子非常簡單。如果用其他語言,就不難理解了。只關註SQL命令。
壹個簡單的SQL註入攻擊案例
如果我們有壹個公司網站,客戶資料等所有重要信息都存儲在網站的後臺數據庫中。如果在網站登錄頁面的代碼中有這樣壹個讀取用戶信息的命令。
$q
=
“選擇
` id '
從
`用戶'
在哪裏
`用戶名`=
'
"
。$_GET['用戶名']。
"
'
和
`密碼`=
'
"
。$_GET['password']。
"
'
";?& gt現在有壹個黑客想攻擊妳的數據庫。他將嘗試在該登錄頁面的用戶名輸入框中輸入以下代碼:
'
顯示
表格;
單擊login鍵,該頁面將顯示數據庫中的所有表。如果他現在使用以下命令:
;
滴
桌子
[表格
姓名];
所以他刪了壹張表!
預防SQL註入
-
使用mysql_real_escape_string()函數。
在數據庫操作的代碼中使用這個函數mysql_real_escape_string()過濾掉代碼中的特殊字符,比如引號。例如:
$q
=
“選擇
` id '
從
`用戶'
在哪裏
`用戶名`=
'
"
。mysql_real_escape_string(
$_GET['用戶名']
).
"
'
和
`密碼`=
'
"
。mysql_real_escape_string(
$_GET['密碼']
).
"
'
";?& gt預防SQL註入
-
使用mysql_query()函數
特別是mysql_query()只會執行sql代碼的第壹條,後面的不會執行。回想壹下在前面的例子中,黑客通過代碼示例在後臺執行了幾個SQL命令,顯示了所有表的名稱。因此,mysql_query()函數可以實現進壹步的保護。我們進壹步發展了剛才的代碼,得到了下面的代碼:
//連接
$數據庫
=
mysql_connect("本地主機",
“用戶名”、“密碼”);
//db
選擇
$q
=
mysql_query("SELECT
` id '
從
`用戶'
在哪裏
`用戶名`=
'
"
。mysql_real_escape_string(
$_GET['用戶名']
).
"
'
和
`密碼`=
'
"
。mysql_real_escape_string(
$_GET['密碼']
).
"
'
",
$ database);?& gt另外,我們還可以判斷PHP代碼中輸入值的長度,或者使用函數來檢查輸入值。因此,必須在接受用戶輸入值的地方過濾和檢查輸入內容。當然,學習和了解最新的SQL註入方法也很重要,這樣才能做到有目的的預防。如果使用Wordpress等平臺型網站系統,應關註官方補丁或及時升級到新版本。