Mybatis 是如何防止SQL注入的?
阿新 • • 發佈:2018-11-22
面試中經常會問到: Mybatis 是如何防止注入的?
首先:SQL是怎樣的注入攻擊的?
String sql = String.Format(
"SELECT * FROM tablename WHERE username='{0}'", username);
當用戶和密碼驗證的時候,會寫 user="2222" &pass="123456" 然後後臺將引數寫入sql 語句進行驗證?假如說引數寫為
user=“ or 1=1 ”
到資料庫的查詢時候就會出現:
SELECT * FROM tabalename WHERE (username= 1) OR 1 = 1
這樣,你無論輸入什麼,都能返回結果。 這就是注入的本質,
如何防止注入的?
本質: 就是對輸入的引數進行校驗, parametertype ="int or map or string ", 這樣輸入其他引數就不能解析,就會報錯,其二:#{引數},對SQL進行預編譯的。
MyBatis框架作為一款半自動化的持久層框架,其SQL語句都要我們自己手動編寫,這個時候當然需要防止SQL注入。其實,MyBatis的SQL是一個具有“輸入
<select id="getTablesByUserId" parameterType="java.util.Map" resultType="com.inspur.tax.sjaqgl.ztree.data.YsjEntity"> SELECT YSJ_ID ysjId,'sjb' as mtype, YSJ_DM ysjDm, '0' isParent, SJYSJ_ID sjysjId, BBH, YSJ_LX ysjLx FROM YSJ_JBXX_BCJ_LS T WHERE 1 = 1 <if test="parentId != null and parentId != ''"> AND T.SJYSJ_ID = #{parentId,jdbcType=VARCHAR} </if> </select>
其實Mabatis防止注入的關鍵所在: 對輸入引數進行校驗,parameterType ="java.util.Map" 就表明必須輸入Map型別引數,輸入其他引數報錯。