春天里,百花香...
SQL注入攻擊 SQL注入攻擊的基本原理,是從客戶端合法接口提交特殊的非法代碼,讓其注入到服務(wù)器端執(zhí)行業(yè)務(wù)的SQL中去,進(jìn)而改變SQL語句的原有邏輯和影響服務(wù)器端正常業(yè)務(wù)的處理。 SQL注入攻擊是Web應(yīng)用中一個重要的安全問題,雖然Java具備較高的安全性,但如果開發(fā)人員不注意,也有可能留下安全隱患,請看示例:
執(zhí)行驗證的SQL語句 現(xiàn)有一個Login頁面用來控制WebApp的入口,用戶想要進(jìn)入只有輸入“用戶名”和“密碼”,負(fù)責(zé)用戶登錄處理的Servlet接受到請求后,將看數(shù)據(jù)表usertable中是否存在這個用戶名和密碼,如果存在則讓其進(jìn)入,否則拒絕,進(jìn)行驗證的SQL語句如下:
執(zhí)行完這條SQL語句后,如果記錄數(shù)等于零說明在usertable表找不到用戶名和密碼對應(yīng)的記錄,應(yīng)該拒絕;如果記錄數(shù)大于零則說明能在usertable表中找到對應(yīng)的記錄,應(yīng)予放行。
如果用戶進(jìn)行SQL注入則可使驗證無效
如果用戶通過某種途徑知道或是猜測出了驗證SQL語句的邏輯,他就有可能在表單中輸入特殊字符改變SQL原有的邏輯,比如在名稱文本框中輸入“ ‘ or ’1‘=’1‘ or ’1‘=’1 ”或是在密碼文本框中輸入“ 1‘ or ’1‘=’1 ”,SQL語句將會變成:
明顯,or和單引號的加入使得where后的條件始終是true原有的驗證完全無效了。
使用正則表達(dá)式屏蔽特殊字符
使用SQL注入攻擊多在特殊字符上下手腳,如“’”,“*”,“/” ,”--”等,如果用正則表達(dá)式限制特殊字符輸入,這些手段將沒有效果。下面的代碼將阻止含有特殊字符的請求。
使用PreparedStatement代替Statement
SQL注入攻擊能得逞是因為在原有SQL語句中加入了新的邏輯,如果使用PreparedStatement執(zhí)行SQL語句,其后只是輸入?yún)?shù), SQL注入攻擊手段將無效,這是因為PreparedStatement不允許在不同的插入時間改變查詢的邏輯結(jié)構(gòu)。示例代碼如下:
PreparedStatement的錯誤使用
用PreparedStatement來防范SQL注入攻擊是因為“因為PreparedStatement不允許在不同的插入時間改變查詢的邏輯結(jié)構(gòu)”,如果如下使用則起不到這個效果,因為SQL語句和參數(shù)沒有分開,它們被組合在一起被一次性提交了。
這種情況下要防范SQL注入攻擊還是要借助于正則表達(dá)式。
小結(jié)
1.Web系統(tǒng)通常采用數(shù)據(jù)庫作為數(shù)據(jù)源,而大多數(shù)業(yè)務(wù)處理都離不開SQL語句,因此系統(tǒng)潛在就有被SQL注入攻擊的隱患,攻擊可能會從任何一次URL提交或是FORM提交中發(fā)起。 2.使用PreparedStatement執(zhí)行Sql語句比Statement安全得多,如果能使用PreparedStatement就不該用Statement,當(dāng)然SQL主體和參數(shù)應(yīng)該分開。 3.如果因為要執(zhí)行動態(tài)多變的SQL語句而不得已采用Statement,則應(yīng)該在服務(wù)器端用正則表達(dá)式進(jìn)行輸入驗證。 4.客戶端驗證可能被取消,因此服務(wù)器端驗證必不可少。
posted on 2008-10-11 19:52 sitinspring 閱讀(10289) 評論(3) 編輯 收藏 所屬分類: Java API 、DB&SQL
很不錯的文章,看來我以后要多注意細(xì)節(jié)問題了! 回復(fù) 更多評論
33333 回復(fù) 更多評論
‘ or ’1‘=’1‘ or ’1‘=’1 回復(fù) 更多評論
Powered by: BlogJava Copyright © sitinspring