1. 程式人生 > >Mybatis 是如何防止SQL注入的?

Mybatis 是如何防止SQL注入的?

面試中經常會問到: 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型別引數,輸入其他引數報錯。