Web十大安全隱患之SQL注入
注入往往是應(yīng)用程序缺少對輸入進(jìn)行安全性檢查所引起的,攻擊者把一些包含指令的數(shù)據(jù)發(fā)送給解釋器,解釋器會把收到的數(shù)據(jù)轉(zhuǎn)換成指令執(zhí)行。常見的注入包括SQL注入,OS Shell,LDAP,Xpath,Hibernate等等,而其中SQL注入尤為常見。這種攻擊所造成的后果往往很大,一般整個(gè)數(shù)據(jù)庫的信息都能被讀取或篡改,通過SQL注入,攻擊者甚至能夠獲得更多的包括管理員的權(quán)限。
先來說說sql注入漏洞是怎么產(chǎn)生的,或者說對于一個(gè)程序開發(fā)人員應(yīng)該怎么防范SQL注入的吧。
SQL注入往往是在編寫包含用戶輸入的動態(tài)數(shù)據(jù)庫查詢時(shí)產(chǎn)生的,但其實(shí)防范SQL注入的方法非常簡單。程序員只不再寫動態(tài)查詢,或防止用戶輸入包含能夠破壞查詢邏輯的惡意SQL語句,就能夠防范SQL注入。當(dāng)然,我作為一個(gè)測試人員說起來很容易,做起來就難了。
我本人只會java,所以后邊我就用Java代碼作為示例:
<font face="宋體" color="#000000">String query ="SELECT account_balance FROM user_data WHERE user_name =" + request.getParameter("customerName"); try { Statement statement = connection.createStatement( …); ResultSet results = Statement.executeQuery(query); }</font> |
在以上代碼中,我們可以看到并未對變量customerName做驗(yàn)證,customerName的值可以直接附在query語句的后面?zhèn)魉偷綌?shù)據(jù)庫執(zhí)行,那么攻擊者可以將任意的sql語句注入。
上邊說到怎么產(chǎn)生的,我們接著說怎么樣才能讓sql注入的漏洞避免。本來計(jì)劃把這一段放在如何測試之后再介紹,但是貌似先介紹出來更方便理解。
防范方法一 :參數(shù)化查詢
參數(shù)化查詢是所有開發(fā)人員在做數(shù)據(jù)庫查詢時(shí)首先需要學(xué)習(xí)的,參數(shù)化查詢迫使所有開發(fā)者首先要定義好所有的SQL代碼,然后再將每個(gè)參數(shù)逐個(gè)傳入,這種編碼風(fēng)格就能夠讓數(shù)據(jù)庫辨明代碼和數(shù)據(jù)。
參數(shù)化查詢能夠確保攻擊者無法改變查詢的內(nèi)容,在下面修正過的例子中,如果攻擊者輸入了UsrID是“’or ‘1 ‘=’1”,參數(shù)化查詢會去查找一個(gè)完全滿足名字為‘or ‘1 ‘=’ 1的用戶。
對于不同編程語言,有一些不同的建議:
Java——使用帶綁定變量的PreparedStatement();
其他的:。。。不好意思,真不會
示例:
<font face="宋體" color="#000000">String custname = request.getParameter("customerName"); String query ="SELECT account_balance FROM user_data WHERE user_name= ?"; PreparedStatement pstmt = connection.prepareStatement(query); Pstmt.setString1,custname(); ResultSet results = pstmt.executeQuery();</font> |
防范方法二:存儲過程
存儲過程和參數(shù)化查詢的作用是一樣的,唯一的不同在于存儲過程是預(yù)先定義并存放在數(shù)據(jù)庫中,從而被應(yīng)用程序調(diào)用的。
Java存儲過程示例:
String custname = request.getParameter("customerName"); try { CallableStatement cs = connection.prepareCall("call sp_getAccountBalance(?)}"); cs.setString(1,custname); Result results = cs.executeQuery(); }catch(SQLException se){ //error handling } |
posted on 2013-12-09 10:39 順其自然EVO 閱讀(329) 評論(0) 編輯 收藏 所屬分類: 安全性測試