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