Mybatis模糊查询防止sql注入

$ 的作用实际上是字符串拼接,
select * from t a b l e N a m e tableName tableName
等效于
StringBuffer sb = new StringBuffer(256);
sb.append("select * from ").append(tableName);
sb.toString();

#用于变量替换
select * from table where id = #id#
等效于
prepareStement = stmt.createPrepareStement(“select * from table where id = ?”)
prepareStement.setString(1,‘abc’);


说道这里, 总结一下, 什么时候用$,什么时候 用 #

对于变量部分, 应当使用#, 这样可以有效的防止sql注入, 未来,# 都是用到了prepareStement,这样对效率也有一定的提升

只 是 简 单 的 字 符 拼 接 而 已 , 对 于 非 变 量 部 分 , 那 只 能 使 用 只是简单的字符拼接而已,对于非变量部分, 那只能使用 使, 实际上, 在很多场合,$也是有很多实际意义的
例如
select * from t a b l e N a m e tableName tableName 对于不同的表执行统一的查询
update t a b l e N a m e tableName tableName set status = #status# 每个实体一张表,改变不用实体的状态
特别提醒一下, $只是字符串拼接, 所以要特别小心sql注入问题。

以上引用于一个帖子的回复
[https://www.iteye.com/topic/726853?page=2]

  • 存在风险的情况

  • and bigname like ‘%${name}%’

  • 建议写法
    1.bind + #{} 模糊查询 防止SQL注入 (#{}进行预编译,传递的参数不进行编译,只作为参数,相当于PreparedStatement)

bind 元素可以从 OGNL 表达式中创建一个变量并将其绑定到上下文。比如:

<select id="selectBlogsLike" resultType="Blog">
  <bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
  SELECT * FROM BLOG
  WHERE title LIKE #{pattern}
</select>

2.concat(concat('%',#{documentName}),'%')

【结论】在编写MyBatis的映射语句时,尽量采用“#{xxx}”这样的格式。若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止SQL注入攻击。

#{}:相当于JDBC中的PreparedStatement

${}:是输出变量的值

简单说,#{}是经过预编译的,是安全的;${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入。

如果我们order by语句后用了${},那么不做任何处理的时候是存在SQL注入危险的。你说怎么防止,那我只能悲惨的告诉你,你得手动处理过滤一下输入的内容。如判断一下输入的参数的长度是否正常(注入语句一般很长),更精确的过滤则可以查询一下输入的参数是否在预期的参数集合中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值