java防SQL注入,最簡單的辦法是杜絕SQL拼接,SQL注入攻擊能得逞是因為在原有SQL語句中加入了新的邏輯凉驻,如果使用PreparedStatement來代替Statement來執(zhí)行SQL語句,其后只是輸入?yún)?shù)雄家,SQL注入攻擊手段將無效胀滚,這是因為PreparedStatement不允許在不同的插入時間改變查詢的邏輯結(jié)構(gòu) ,大部分的SQL注入已經(jīng)擋住了, 在WEB層我們可以過濾用戶的輸入來防止SQL注入比如用Filter來過濾全局的表單參數(shù) 。
例如:
字符串拼接(不安全): jdbcTemplate.update("update user set age = "+age+" where uuid = "+uuid);
例如:
參數(shù)化sql(安全):jdbcTemplate.update("update user set age = ? where uuid = ?",newObject[]{age,uuid});
或者
String sql = "insert into user(name,age) values (?,?)";
jdbcTemplate.update(sql, new PreparedStatementSetter() {? ? ??
@Override? ? ?
?public void setValues(PreparedStatement ps) throws SQLException {?
? ? ? ? ? ps.setString(1, "sixmonth");?
? ? ? ? ? ps.setInt(2, 18);?
? }});
都相對安全
mybatis防止sql注入
mybatis是一款優(yōu)秀的持久層框架顷编,在防止sql注入方面褐荷,mybatis啟用了預(yù)編譯功能,在所有的SQL執(zhí)行前层宫,
都會先將SQL發(fā)送給數(shù)據(jù)庫進行編譯其监,執(zhí)行時,直接替換占位符"?"即可抖苦;
mybatis在處理傳參的時候米死,有兩種處理方式贮庞,一種是#,另一種是$物喷;
#{XXX}遮斥,將傳入?yún)?shù)都當成一個字符串,會自動加雙引號尉辑,已經(jīng)經(jīng)過預(yù)編譯较屿,安全性高,能很大程度上防止sql注入吝镣;
${XXX},該方式則會直接將參數(shù)嵌入sql語句,未經(jīng)過預(yù)編譯整吆,安全性低,無法防止sql注入拴测;