@Select("select * from user where name = ${name}")
List<User> sqltest1(String name);
复制代码
假如传进去的参数是
name = "1' OR 1='1";
复制代码
那么数据库末了执行的语句则为
select * from user where name = '1' OR 1='1 ';
复制代码
会直接导致sql注入,被攻击者成功登录
2)语句堵塞
@Select("select * from user order by ${column}")
List<User> sqltest1(String column);
复制代码
假如传进去的参数是
column = "id,(select 1 from (select sleep(1000))a)"
复制代码
那么数据库末了执行的语句则为
select * from user order by id,(select 1 from (select sleep(1000))a)
复制代码
可以发现步伐会壅闭1000秒,被攻击者造成语句堵塞
(2)#{}
1)无法执行
@Select("select * from user order by #{column}")
List<User> sqltest1(String column);
复制代码
假如传进去的参数是
column = "name";
复制代码
那么#{}会自动给参数加上单引号,数据库语句变成
select * from user order by 'name'
复制代码
无法正常执行
2)无法执行
@Select("select * from user where name like '%#{name}%'")
List<User> sqltest2(String name);
复制代码
假如传入的参数为
name = "yin";
复制代码
那么数据库语句就变成
select * from user where name like '%'name'%'
复制代码
直接报错,无法执行
3.解决办法
正常来看,一般的解决方法可以使用#{}来取代KaTeX parse error: Expected 'EOF', got '#' at position 14: {},但是有的语句假如使用#̲{}会造成语句错误(因为#{}…{}的有动态指定order
by 排序字段、和like模糊匹配,但是这种方式会带来sql注入题目。具体解决方法如下:
(1)动态指定order by 排序字段