什么是SQL注入?会带来哪些威胁?我们该如何解决呢?

目录

1.参数占位符#{}和${}的关系

2.sql注入产生的原因及威胁

3.sql注入演示

4.${}的优点

1.排序查询

2.使用like关键字

5.总结


1.参数占位符#{}和${}的关系

  • #{}:预编译处理
  • ${}:字符直接替换

什么是预编译处理呢?

预编译处理就是MyBatis在处理#{}时,会将SQL中的#{}替换为?号,使用PreparedStstement的set方法来进行赋值

直接替换就是直接把¥{}替换成变量的值

那么这两个有什么区别呢?这里我们要知道一个概念SQL注入问题

2.sql注入产生的原因及威胁

当我们访问动态网页时,Web服务器会向数据访问层发起sql查询请求,如果权限通过就会执行sql语句,这种网站内部直接发送Sql请求一般没什么问题,但是很多时候我们是要根据用户的输入来动态的构造sql语句,如果用户恶意输入数据,但Web应用又未对动态构造的sql语句进行审查,那么就会带来意想不到的危险

sql注入带来的威胁一般有以下几个方面

  • 猜测后台数据库,这是利用最多的方式,盗取网络的敏感信息
  • 绕过登陆验证,直接登陆网站后台
  • 注入可以借助数据库的存储过程提权等操作

3.sql注入演示

使用我们上篇博客的数据表来演示一下登录的sql注入操作

先来测试#{}编译预处理的情况 (密码错误)

我们在yml中配置一下,使控制台打印SQL日志

 可以看到没有查找到结果 ,并没有成功登录

我们继续测试${}直接替换的效果

 可以看到查询出结果并且成功登陆了

这就非常可怕了,使用一个错误的密码能登陆上所有的账号信息,那么互联网就没有隐私可言了,所以我们一定要避免出现这种情况

既然如此,那么我们直接用#{}就好了,还要${}干嘛呢?他难道有其他的作用吗?确实有的,每个东西都有他存在的道理

4.${}的优点

1.排序查询

我们细心观察就会发现,软件中有很多需要排序的地方,在这种情况下,使⽤ ${sort} 可以实现排序查询,这是为什么呢?

我们写一个方法来测试一下:

 

可以看到报错了,并未查询到我们想要的结果,这是因为当使⽤ #{sort} 查询时,如果传递的值为 String 则会加单引号,就会导致 sql 错误

我们再测试一下${}

 

可以看到使用${}正确显示了结果,所以排序只能使用${},虽然它存在sql注入的问题,但是sql注入是因为用户输入的恶意参数导致的,所以我们在排序的时候不让用户输入就可以了,就比如只设置按钮让用户点击就可以了,参数由后端人员来设置,这样就可以避免sql问题了

2.使用like关键字

 

  

 

使用#{}运行后我们发现报错了 ,我们再来试试${}

 

可以看到使用${}成功查找出来了数据 ,但是使用${}依然存在Sql注入的问题,所以一定要去解决这个问题,但是这个又不能像上面排序一样可以设置按钮,使用like模糊匹配必须得接受用户的参数,那么我们该怎么解决呢?

我们可以使用MySQL的一个内置函数CONACAT,就像下面这样,同样成功查询到了数据

 我们再去测试一下,现在我们在使用#{}就不会有问题了

我们看到结果也是成功显示了,而且也避免了sql注入的问题

5.总结

综上所述,我们发现只要在排序的时候使用${},而在其它地方都一律使用#{},这样就不会出错了

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值