SQL注入 mybatis的#{} ${} statement preparestatement

21 篇文章 0 订阅

一个sql 是经过解析器编译并执行,注意这里是一个字。

${}
select * from account where username = ${username} and password = ${password} limit 10
如果为username 传参数 '1' or 1=1 #   password  aaa

上述sql语句经过编译并执行就变成了   **参数参与了编译**
select * from account where username = '1' or 1=1 # and password = aaa limit 10
就可以查出所有account信息,这就形成了sql注入

而 
#{}
select * from account where username = #{username} and password = #{password} limit 10
mybatis会先进行该语句预编译成 
select * from account where username = ? and password = ? limit 10
放入到缓存池中。等到服务器执行execute的时候,传给数据库的  '1' or 1=1 # 参数 并不会被编译,而是找到之前编译好的sql模板,进行传参,执行。也就是说 '1' or 1=1 #  只会被数据库当作参数来处理不会被编译。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值