我们经常使用的是#{},一般解说是因为这种方式可以防止SQL注入,简单的说#{}这种方式SQL语句是经过预编译的,它是把#{}中间的参数转义成字符串,
一般能用#的就别用$
实际开发时有时需要用like做模糊匹配,我这里图省事直接用 ${}拼接 如图:
下面我们测试下SQL注入场景,这个sql执行是通过前端搜索框触发的,我们本地启服务打个断点:
2021-12-29 18:31:57.870 DEBUG 9668 --- [io-8081-exec-29] c.p.m.BlogMapper.findIndexPage_COUNT : ==> Preparing: select count(0) from (select bl_id,title,outline,background_image,recommend,commentabled,published,views,ty_id,create_time,update_time from t_blog where published=true AND title like "%canal%" order by create_time desc) tmp_count
看控制台输出的SQL因为用到了 PageHelper分页 会先执行一个 count() 语句,现在我们把参数改下:
再看数据库:
Person表被创建了,SQL注入成功
因为是GET请求,我们将
%a")tmp_count;CREATE TABLE Persons ( Id_P int, LastName varchar(255));--
做URL编码后如下:
%25a%22)tmp_count%3BCREATE%20TABLE%20Persons%20(%20Id_P%20int%2C%20LastName%20varchar(255))%3B--
我们删除Person表,将上面语句直接放到页面输入,查看执行结果,Person表又被创建了,SQL注入成功
1.使用#{}配合mysql的concat函数
2.参数拼接%后再使用#{}
评论