從零開始認(rèn)識(shí)SQL注入 ,什么是SQL注入?sql注入就是本來我只有我能操作數(shù)據(jù)庫,本來只是讓你輸入內(nèi)容就走,而你卻輸入命令,從而在我不知情下操作數(shù)據(jù)庫
SQL注入
1.什么是SQL注入
-
看一下下面的案例場景,這是正常情況下的登陸場景:
-
而當(dāng)我們使用 用戶名‘:– 的時(shí)候,密碼隨便輸入也可以登陸成功↓
-
這時(shí)候?qū)Ρ葍蓷lsql就能發(fā)現(xiàn),其實(shí)用戶通過在用戶名寫入的sql符號(hào)將內(nèi)部sql提前結(jié)束,并且將后半句檢索條件注釋起來達(dá)到免密碼登陸效果。
sql注入就是本來我只有我能操作數(shù)據(jù)庫,本來只是讓你輸入內(nèi)容就走,而你卻輸入命令,從而在我不知情下操作數(shù)據(jù)庫
2.漏洞的修復(fù)
-
會(huì)產(chǎn)生上門面的情況是因?yàn)樯厦娴膕ql是使用動(dòng)態(tài)拼接的方式,所以sql傳入的方式可能改變sql的語義。
動(dòng)態(tài)拼接就是在java中java變量和sql語句混合使用:select * from user where userName=’”+userName+”’ and password = ‘”+password”’
-
所以要使用preparedStatement的參數(shù)化sql,通過先確定語義,再傳入?yún)?shù),就不會(huì)因?yàn)閭魅氲膮?shù)改變sql的語義。(通過setInt,setString,setBoolean傳入?yún)?shù))
3.參數(shù)化sql使用案例
????????????//建立數(shù)據(jù)連接 ????????????conn=ds.getConnection(); ????????????//1.設(shè)置prepareStatement帶占位符的sql語句 ????????????PreparedStatement?ptmt?=?conn.prepareStatement("select?*?from?user?where?userName?=???and?password?=??"); ????????????ptmt.setString(1,?"張三");??????//2.設(shè)置參數(shù) ????????????ptmt.setString(2,?"123456"); ????????????rs=ptmt.executeQuery();????? ????????????while(rs.next()){ ????????????????System.out.println("登陸成功"); ????????????????return; ????????????} ????????????System.out.println("登陸失敗");
參數(shù)化特點(diǎn):
1.設(shè)置preparedStatement帶占位符的sql語句
statement執(zhí)行sql語句的方式:
stmt=conn.createStatement(); rs=stmt.executeQuery("select?userName?from?user");
2.設(shè)置參數(shù)
PerparedStatement繼承于Statement,這里主要使用的使他參數(shù)化sql的特性。
轉(zhuǎn):https://blog.csdn.net/qq_30258957/article/details/78145885
加:1.都是用來執(zhí)行SQL的 PreparedStatement extends Statement;
2.Statement適合執(zhí)行靜態(tài)(無條件)SQL? PreparedStatement適合執(zhí)行動(dòng)態(tài)(有條件)SQL;
3.PreparedStatement可以避免注入攻擊;
?相關(guān)文章:
一個(gè)自認(rèn)為很安全的PHP防SQL注入?求破解
一個(gè)自認(rèn)為很安全的PHP防SQL注入?求破解
相關(guān)視頻:
一個(gè)自認(rèn)為很安全的PHP防SQL注入?求破解