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