SQL 注入深度防御:MyBatis 动态 SQL 也能注入?预编译+白名单过滤双保险!
前两天群里有人发了个截图,他们公司一个后台管理系统被人拖了库。查了半天,问题出在一段 MyBatis 的动态排序代码上。那哥们特别委屈:"我没拼字符串啊,我用的是 MyBatis,框架不是自带防注入吗?" 我一看代码,${orderBy} 赫然在目。他以为 MyBatis 是银弹,实际上 $ 和 # 差了一个安全分水岭。 今天聊的这个话题,但凡写过 Java Web 项目的人都会遇到。但很多人对 SQL 注入的认知停留在"用了 MyBatis 就安全了",这个想法比注入本身还危险。 一句话搞懂:# 和 $ 到底差在哪 先别急着看方案,把这个最基础的概念弄明白。 MyBatis 里写 SQL,有两种方式塞参数: -- 方式一:#{} SELECT * FROM user WHERE name = #{name} -- 方式二:${} SELECT * FROM user WHERE name = '${name}' 区别在哪?#{} 走预编译,${} 是字符串拼接。 用 #{} 的时候,MyBatis 会把 SQL 发给数据库之前,先把参数位置用 ? 占位,参数值单独传给数据库。数....