利用mybatis框架时,常见的三种sql注入方式

什么是Sql注入

Sql注入是web应用中最常见的一种漏洞,其实质就是攻击者可以通过拼接sql来对数据库进行攻击。在java项目中,随着预编译和ORM框架(如Mybatis)的使用,这样的问题也会随之减少,但是,在mybatis使用不当的情况下,也会造成sql注入。

Mybatis的SQL注入

在java项目中,mybatis的sql语句通常是写在xml文件中。编写xml语句时候,支持两种参数符号,一种是#,一种是KaTeX parse error: Expected ‘EOF’, got ‘#’ at position 4: ,其中#会使用预编译,而是拼接sql。在Mybatis中,sql注入很容易产生于以下三种情况:

1、使用模糊查询

select * from student where name like '%#{张三}%'

上面的sql语句使用了模糊查询,但是这个sql在mybatis中会报错,因为没法对其进行预编译,但是改为$时就正确了,但是这样会造成sql注入的漏洞,因此推荐下面的写法:

select * from student where name like concat('%', #{张三}, '%"}

2、in之后跟多个参数
在in之后的多个查询参数使用#符号时,同样会报错

select * from student where id in (#{ids})

正确写法是利用foreach,而不是将#换成$,如下所示:

select * from student where id in
<foreach collection = "ids" item = "id" open = "(" close = ")" separator = ",">
  #{id}
<foreach>  

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值