SQL中的安全問題
7.1 SQL注入簡述
SQL Injection攻擊具有很大的危害,攻擊者可以利用它讀取、修改或者刪除數據庫內的數據,獲取數據庫中的用戶名和密碼等敏感信息,甚至可以獲得數據庫管理員的權限。
如果能夠再利用SQLServer擴展存儲過程和自定義擴展存儲過程來執行一些系統命令, 攻擊者還可以獲得該系統的控制權。而且,SQL Injection 也很難防范。網站管理員無法通過安裝系統補丁或者進行簡單的安全配置進行自我保護,一般的防火牆也無法攔截SQLInjection 攻擊。
SQL Injection 原理:
結構化查詢語言(SQL)是一種用來和數據庫交互的文本語言。 SQL Injection 就是利用某些數據庫的外部接口把用戶數據插入到實際的數據庫操作語言(SQL)當中,從而達到入侵數據庫乃至操作系統的目的。它的產生主要是由於程序對用戶輸入 的數據沒有進行嚴格的過濾,導致非法數據庫查詢語句的執行。
如下面的用戶登陸驗證程序:
$sql="SELECT*FROMuserWHEREusername='$username'AND password='$passWord'";
$result = MySQL_db_query($dbname, $sql);
如果我們提交如下url:
http://127.0.0.1/injection/user.PHP?username=angel' or '1=1
那麼就可以成功登陸系統,但是很顯然這並不是我們預期的,同樣我們也可以利用sql的注釋語句實現sql注入,如下面的例子:
http://127.0.0.1/injection/user.PHP?username=angel'/*
http://127.0.0.1/injection/user.PHP?username=angel'%23
這樣就把後面的語句給注釋掉了!說說這兩種提交的不同之處,我們提交的第一句是利用邏輯運算,第二、三句是根據 mysql的特性,MySQL支持/*和#兩種注釋格式,所以我們提交的時候是把後面的代碼注釋掉,值得注意的是由於編碼問題,在 IE地址欄裡提交#會變成空的,所以我們在地址欄提交的時候,應該提交%23,才會變成#,就成功注釋了,這個比邏輯運算簡單得多了。