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

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值