Select * from news where title like ‘%#{title}%’
在这种情况下使用#程序会报错,新手程序员就把#号改成了$,这样如果java代码层面没有对用户输入的内容做处理势必会产生SQL注入漏洞。
正确写法:
select * from news where tile like concat(‘%’,#{title}, ‘%’)
in之后多个id查询时使用# 同样会报错,
Select * from news where id in (#{ids})
正确用法为使用foreach,而不是将#替换为$
id in
#{ids}
这种场景应当在Java层面做映射,设置一个字段/表名数组,仅允许用户传入索引值。这样保证传入的字段或者表名都在白名单里面。需要注意的是在mybatis-generator自动生成的SQL语句中,order by使用的也是$,而like和in没有问题。
参考文档链接:
https://mp.weixin.qq.com/s?__biz=MzI1NDY0MTkzNQ==&mid=2247501774&idx=2&sn=66ba2baffd99e8ffe27103bb1e2d247f&chksm=e9c095aedeb71cb8b712be26f8d411a20b17ec4d3b32a348f91a4cfe878cf8f65ee2b399be29&scene=132#wechat_redirect