文章專區

網頁程式技術探討

SQL Injection 攻擊

SQL Injection 是網站系統中經常遇到的安全問題之一,利用SQL指令插入到表單並藉由特殊字元改變SQL語法結構,當這樣的命令被執行時攻擊者就可以直接對資料庫進行任何的動作。
 
假設現在有一個會員登入功能的網站,使用者登入時必須要驗證帳號、密碼,CommandText為「"select  *  from  member  where  account = '"  +  Request.Form["account"]  +  "'  and  password  =  '"  +  Request.Form["password"]  +  "'"」,帳號輸入「' or 1 = 1 --」,密碼隨意輸入,此時的指令就變成了「"select  *  from  member  where  account  =  ''  or  1=1 -- and  password = ''  "」,因為「--」為註解意思所以後半部的判斷式將不會被執行,而 1 = 1恆成立故駭客也就可以輕鬆登入。
 
SQL 攻擊就是如此簡單,僅需短短的指令就整個資料庫有極大的威脅,透過底下的防範方式可減少資料庫的傷害。
 
 

1.存取資料庫時給予帳號不同的權限

 

不應使用sa或是含有db_owner權限的帳號,如非必要不要賦予Create、Drop、Truncate table權限,可將成員資格限定為「db_datareader」、「db_datawriter」,
 
甚至可單獨對每個物件限定使用權限,但此種作法也比較累人就是。
 
 
2.過濾輸入的內容
在還沒有進行查詢前先把傳入的特殊符號如單引號(‘)、註解符號(--)、分號(;)過濾掉,亦可針對HTML或<script>標籤做些防範。

3.使用參數化查詢
存取資料時輸入的資料不是動態結合到SQL指令,而是透過參數來給值,資料庫在編譯SQL指令後才會套用參數。
SqlCommand cmd = new SqlCommand("select * from member where Account = @Account and Password = @Password", conn);
cmd.Parameters.AddWithValue("Account", "admin");
cmd.Parameters.AddWithValue("Password", "admin");
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();

4.不要將錯誤訊息顯示於頁面上
如將 customErrors設定為off,頁面出錯時會直接把錯誤訊息顯示出來,那麼駭客就能利用這些漏洞攻擊。應建立錯誤頁面,並在網站發生錯誤時導向至該頁面
<customErrors mode="RemoteOnly" defaultRedirect="~/ErrorPages/ Error.aspx"/>