面试中经常会问到: 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类型参数,输入其他参数报错。