java如何防止sql注入
什么是sql注入
????????SQL注入是比較常見的網(wǎng)絡(luò)攻擊方式之一,在客戶端在向服務(wù)器發(fā)送請(qǐng)求的時(shí)候,sql命令通過表單提交或者url字符串拼接傳遞到后臺(tái)持久層,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令;它不是利用操作系統(tǒng)的BUG來實(shí)現(xiàn)攻擊,而是針對(duì)程序員編程時(shí)的疏忽,通過SQL語句,實(shí)現(xiàn)無帳號(hào)登錄,甚至篡改數(shù)據(jù)庫。
sql注入可能產(chǎn)生的影響
????????惡意用戶可以未經(jīng)授權(quán)訪問您的應(yīng)用程序并竊取數(shù)據(jù)。
他們可以更改,刪除數(shù)據(jù)庫中的數(shù)據(jù)并關(guān)閉您的應(yīng)用程序。
黑客還可以通過執(zhí)行數(shù)據(jù)庫特定的系統(tǒng)命令來控制運(yùn)行數(shù)據(jù)庫服務(wù)器的系統(tǒng)。
sql注入的方式
在數(shù)據(jù)庫中創(chuàng)建一張user表,用于保存用戶的詳細(xì)信息,userid為用戶的id,我們?cè)趹?yīng)用 程序中擁有功能,可以根據(jù)用戶userid查詢?cè)撚脩舻脑敿?xì)信息,userid可以從客戶端請(qǐng)求中獲取到:
讓我們來看一下示例代碼:
String userid = "2022"; String sql = "select * from user where userid = " + userid;當(dāng)userid=2022時(shí),我們可以查詢出userid為2022的用戶的詳細(xì)信息;
當(dāng)用戶進(jìn)行惡意攻擊時(shí):例如userid = "" or 1 =1 ;這時(shí)候sql就變成了下面代碼:
select * from user where userid = "" or 1 = 1;這就會(huì)查詢出所有數(shù)據(jù),更嚴(yán)重者直接刪表刪庫,后果可想而知。。。。
防止sql注入的方式
? ? ? ? 最簡(jiǎn)單的解決方案就是使用PreparedStatement來執(zhí)行查詢,它會(huì)將原sql語句進(jìn)行預(yù)先編譯,
? ? ? ? 從請(qǐng)求中接受到的userid被視為ui數(shù)據(jù),不會(huì)產(chǎn)生sql注入。
String sql = "select * from user where userid = ?"; Connection conn = null; PreparedStatement stmt = null; stmt = conn.prepareStatement(sql); stmt.setString(1,userid);mybatis防止sql注入
????????mybatis是一款優(yōu)秀的持久層框架,在防止sql注入方面,mybatis啟用了預(yù)編譯功能,在所有的SQL執(zhí)行前,
都會(huì)先將SQL發(fā)送給數(shù)據(jù)庫進(jìn)行編譯,執(zhí)行時(shí),直接替換占位符"?"即可;
mybatis在處理傳參的時(shí)候,有兩種處理方式,一種是#,另一種是$;
#{XXX},將傳入?yún)?shù)都當(dāng)成一個(gè)字符串,會(huì)自動(dòng)加雙引號(hào),已經(jīng)經(jīng)過預(yù)編譯,安全性高,能很大程度上防止sql注入;
${XXX},該方式則會(huì)直接將參數(shù)嵌入sql語句,未經(jīng)過預(yù)編譯,安全性低,無法防止sql注入;
?
總結(jié)
以上是生活随笔為你收集整理的java如何防止sql注入的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Poj2586 每五个月都是亏
- 下一篇: js时间基本操作