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类型参数,输入其他参数报错。

猜你喜欢

转载自blog.csdn.net/qq_30125555/article/details/82871795