首页 > 数据库技术 > 详细

mybaits的sql注入

时间:2020-07-21 00:11:08      阅读:82      评论:0      收藏:0      [点我收藏+]

MyBatis支持两种参数符号,一种是#,另一种是$。比如:

<select id="queryAll"  resultMap="resultMap">
  SELECT * FROM NEWS WHERE ID = #{id}
</select>

<select id="queryAll"  resultMap="resultMap">
  SELECT * FROM NEWS WHERE ID = ${id}
</select>

#{}速度快,能防止sql注入,是占位符方式,先预编译,然后填充参数,字符串格式,相当于填空题 用户名=(___),参数只是下划线上的内容
${}是直接拼接到语句上,执行语句,对于上面那道填空题 ,这种方式需要自己拼括号和参数,但是也可以拼接想执行的任何语句,也就是传说中的sql注入
我们在日常使用中应该尽量使用#{},但是在某些情况下不得不使用${}这个时候就需要特别注意sql注入的问题。

1.模糊查询

错误示例:

Select * from news where title like ‘%#{title}%’

这种写法是错误的,如果只是像

Select * from news where title like ‘%${title}%’

这样简单的将#换成$而不再java代码层面进行验证限制。就很容易出现sql注入问题,我们可以这样写

select * from news where tile like concat(‘%’,#{title}, ‘%’)

2.in 之后的多个参数

错误示例

Select * from news where id in (#{ids})

正确用法为使用foreach,而不是将#替换为$

<foreach collection="ids" item="item" open="("separatosr="," close=")">
#{ids} 
</foreach>

order by 之后

这种场景应当在Java层面做映射,设置一个字段/表名数组,仅允许用户传入索引值。这样保证传入的字段或者表名都在白名单里面。需要注意的是在mybatis-generator自动生成的SQL语句中,order by使用的也是$,而like和in没有问题。

mybaits的sql注入

原文:https://www.cnblogs.com/jiezao/p/13347320.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!