一、SQL注入簡介
SQL注入是比較常見的網(wǎng)絡(luò)攻擊方式之一,它不是利用操作系統(tǒng)的BUG來實現(xiàn)攻擊,而是針對程序員編程時的疏忽,通過SQL語句,實現(xiàn)無帳號登錄,甚至篡改數(shù)據(jù)庫。
二、SQL注入攻擊的總體思路
1.尋找到SQL注入的位置
2.判斷服務(wù)器類型和后臺數(shù)據(jù)庫類型
3.針對不通的服務(wù)器和數(shù)據(jù)庫特點進(jìn)行SQL注入攻擊
三、SQL注入攻擊實例
比如在一個登錄界面,要求輸入用戶名和密碼:
可以這樣輸入實現(xiàn)免帳號登錄:
用戶名: ‘or 1 = 1 –
密 碼:
點登陸,如若沒有做特殊處理,那么這個非法用戶就很得意的登陸進(jìn)去了.(當(dāng)然現(xiàn)在的有些語言的數(shù)據(jù)庫API已經(jīng)處理了這些問題)
這是為什么呢? 下面我們分析一下:
從理論上說,后臺認(rèn)證程序中會有如下的SQL語句:
String sql = "select * from user_table where username=
' "+userName+" ' and password=' "+password+" '";
當(dāng)輸入了上面的用戶名和密碼,上面的SQL語句變成:
SELECT * FROM user_table WHERE username=
'’or 1 = 1 -- and password='’
分析SQL語句:
條件后面username=”or 1=1 用戶名等于 ” 或1=1 那么這個條件一定會成功;
然后后面加兩個-,這意味著注釋,它將后面的語句注釋,讓他們不起作用,這樣語句永遠(yuǎn)都能正確執(zhí)行,用戶輕易騙過系統(tǒng),獲取合法身份。
這還是比較溫柔的,如果是執(zhí)行
SELECT * FROM user_table WHERE
username='' ;DROP DATABASE (DB Name) --' and password=''
….其后果可想而知…
四. 解決方法:
1> 首先對接收到的數(shù)據(jù)先進(jìn)行字符串過濾, 如使用以下函數(shù)
function post_check($post) { if (!get_magic_quotes_gpc()) { // 判斷magic_quotes_gpc是否為打開 $post = addslashes($post); // 進(jìn)行magic_quotes_gpc沒有打開的情況對提交數(shù)據(jù)的過濾 } //$post = str_replace("_", "", $post); // 把 '_'過濾掉 $post = str_replace("%", "", $post); // 把 '%'過濾掉 $post = str_replace("'", "", $post); $post = str_replace("exec", "", $post); $post = str_replace("select", "", $post); $post = str_replace("update", "", $post); $post = str_replace("exec", "", $post); $post = str_replace("from", "", $post); $post = str_replace("drop", "", $post); $post = nl2br($post); // 回車轉(zhuǎn)換 $post = htmlspecialchars($post); // html標(biāo)記轉(zhuǎn)換 return $post; }
2. 平臺盡量使用一些PHP 框架來操作, 因為這些框架在底層都使用了安全過濾機制, 如: THINKPHP框架, 在底層使用了PDO預(yù)處理機制及自動參數(shù)綁定功能
3. 如果一定要使用原生SQL語句查詢, 請使用PDO的參數(shù)綁定, 或者命名點位符功能