SQL注入與防範,SQL注入防範
SQL注入簡介: 所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入欄位名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的SQL命令。具體來說,它是利用現有應用程式,將(惡意)的SQL命令注入到後台資料庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全性漏洞的網站上的資料庫,而不是按照設計者意圖去執行SQL語句。
SQL注入方法: 一、拼接字串(通過輸入框輸入SQL語句使其改變原意)Select * from T_User where UserID =’txtUserID.Text’andPassword=’ txtPassword.Text ’
其原理是通過尋找T_User 表中的使用者名稱(UserID) 和密碼(Password) 的結果來進行授權訪問, 在txtUserID.Text為mysql,txtPassword.Text為mary,那麼SQL查詢語句就為:
Select * from users where username =’ mysql ’ and password =’ mary ’
如果分別給txtUserID.Text 和txtPassword.Text賦值’ or ‘1’ = ‘1’ --和abc。那麼,SQL 指令碼解譯器中的上述語句就會變為:
Select * from T_User where UserID =’’or ‘1’ = ‘1’ -- and Password =’abc’
該語句中進行了兩個條件判斷,只要一個條件成立,就會執行成功。而'1'='1'在邏輯判斷上是恒成立的,後面的"--" 表示注釋,即後面所有的語句為備註陳述式這樣我們就成功登入。即SQL注入成功.
原來SQL語句:insert into category(name) values(‘”+caName+”’)
輸入框中輸入:caName=娛樂新聞’)select category --‘)
SQL語句變成:insert into category(name) values(‘娛樂新聞’)Select category --‘)
SQL語句改變後,將執行插入和查詢兩個操作(如果修改的不是查詢而是刪除將會更加可怕),即SQL注入成功。
二、查看錯誤頁資訊(SQL Server有一些系統變數,如果我們沒有限制錯誤資訊的輸出,那麼注入著可以直接從出錯資訊擷取)Web中的網址:http://www.xxx.com/Login.aspx?id=49 and user>0首先,前面的語句是正常的,重點在and user>0,我們知道,user是SQL Server的一個內建變數,它的值是當前串連的使用者名稱 ,類型為nvarchar。拿一個nvarchar的值跟int的數0比較,系統會先試圖將nvarchar的值轉成int型,當然,轉的過程中肯定會出錯,SQL Server的出錯提示是:將nvarchar值 ”abc” 轉換資料類型 為 int 的列時發生語法錯誤,abc正是變數user的值,這樣,注入著就拿到了資料庫的使用者名稱,即SQL注入成功。
SQL注入防範: 一、簡單防範:1.輸入框中限制特殊字元以及長度
2.Web中設定錯誤提示頁即:
在Web.Config檔案中設定
<!--出現錯誤的時候自動導向("~/error.html"是彈出頁面的路徑)-->
<customErrors mode="On" defaultRedirect ="~/error.html" ></customErrors>
3.URL重寫:
URL重寫就是首先獲得一個進入的URL請求然後把它重新寫成網站可以處理的另一個URL的過程。舉個例子來說,如果通過瀏覽器進來的URL是“UserProfile.aspx?ID=1”那麼它可以被重寫成“UserProfile/1.aspx”
二、SQL語句中的防範1.參數化查詢:參數化查詢(Parameterized Query 或 Parameterized Statement)是指在設計與資料庫連結並訪問資料時,在需要填入數值或資料的地方,使用參數 (Parameter) 來給值。
例如:
不使用參數化查詢:
string sql = "select * from comment where newsId = "txtnewsId" order by createTime desc";
因為上面SQL語句中的"txtnewsId"是不確定的,每次調用的時候需要將SQL語句重新編譯,這就能用上面的拼接字串實現SQL注入。
使用參數化查詢:
string sql = "select * from comment where newsId = @newsId order by createTime desc";
SqlParameter[] paras = new SqlParameter[]{new SqlParameter ("@newsId",newsId)};
因為上面SQL語句是固定的,調用的時候只需要將@newsId的值傳上去就可以,所以即便使用者輸入任何資訊也會當成一個值傳遞進去,防止SQL注入。
2.通過寫預存程序:
其實在預存程序裡面也需要用到參數化查詢並且預存程序本身沒有SQL注入這兩點同時滿足才能防止SQL注入。
3.限制資料庫的存取權限:
設立不同使用者的特殊許可權,例如:使用者名稱為1的使用者只允許查詢操作,然而使用者1的資訊被盜取登陸之後就不能對錶進行別的操作,這樣就一定程度上保證了資料的安全性。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。