天天看点

Mybatis如何防止SQL注入的骚操作

SQL注入是一种常见的Web漏洞攻击手段,危害非常严重。攻击者利用漏洞不但可以看到全部数据,更有甚者删库跑路。

一、SQL注入演示

SQL注入,可以利用传入的参数,进行恶意伪造,伪造后的参数最终通过前台传入到后端执行,

1、示例一(查询敏感信息)

比如,我们有一个查询接口,可以查询当前用户的信息,

select * from user where id = '1';
           

正常执行不会出现问题,一旦被sql注入,比如将传入参数 id="3 or 1=1" ,那么sql会变成

select * from user where id = 3 or 1=1
           

这样所有用户信息就一览无遗了。

2、示例二(恶意删表)

比如,我们现在有个简单的页面表单,只要输入name,就可以插入到 user 用户表,

insert into user(name) values('zhangsan');
           

其中name字段来自页面的前端input输入,有恶意攻击者输入了这个 'lisi');drop table user;--

insert into user(name) values('lisi');drop table user;--;
           

如果真被执行了,完蛋了,表被删了。

二、如何防止SQL注入

1、使用ORM框架提供的方法

一般ORM框架都做了SQL防注入的方案,比如Mybatis,传入参数时,推荐用 #{para},而不是 ${para}。

  • #将传入的数据当成一个字符串,会对传入的数据加一个双引号,比如where id = “123”。
  • $将传入的数据直接显示在sql中,比如 where id = 123。

因此,#与$相比,#可以很大程度的防止sql注入,因为对sql做了预编译处理,因此在使用中一般使用#{}方式。

2、加强参数输入验证,正则匹配过滤

加强数据输入验证,使用正则表达式等字符串过滤手段限制数据项的格式、字符数目等,尤其是避免数据项中存在引号、分号等特殊字符就能很大程度上避免SQL注入问题的发生。

3、避免常规化的数据库表名、字段名的设计

比如数据库表 user,设计时可以加些前缀,不容易猜到的,比如xxx_xxx_t_user。实际上,SQL注入也并不是那么简单的,一个前提就是需要攻击者本身对数据库的结构有足够的了解才能够成功。因此在构建数据库的时候要尽量使用较为复杂的结构和命名方式,就能有效降低被攻击成功的概率。

4、注意数据库备份和对敏感内容进行加密

不怕一万就怕万一,定期的数据备份还是要做的。另外,一些敏感数据可以适当加密后再存入db,取出后按规则解密,虽说麻烦些,但安全。当然,具体大家还是要按照实际的业务场景来。