Spring+Mybatis组件的开发方式是目前最常见的Java Web开发技术栈,在该技术栈中会在XML映射文件中编写SQL语句,通过#$符号标注动态参数位置,而MyBatis会在运行的过程中通过预编译绑定参数以实现查询
在XML中编写SQL语句存在一些场景容易出现SQL注入,根本原因是使用${}拼接符,MyBatis在解析该符号时,会直接拼接变量,导致攻击者可以输入恶意内容污染原有SQL语句。这部分的内容也是目前网上提到的最多的。
MyBatis-Plus 是一个 Mybatis 增强版工具,在 MyBatis 上扩充了其他功能没有改变其基本功能,为了简化开发提交效率而存在。
使用时只需要在编写Mapper类时继承MyBatis-Plus的BaseMapper类,即可获得一些封装好的CURD方法,而不需要在XML中编写相关的SQL语句,比如save、remove、update等方法,这些方法的参数大多都支持传入查询条件过滤器wrapper。
Wrapper有四种,其结构关系见下图。
主要类型为两种,即查Query和改Update,改包括了增、删、改。然后又根据列名匹配是否使用Lambda表达式而多了LambdaQuery和LambdaUpdate两种Mapper。
在使用常规的QueryMapper和UpdateMapper时,会使用预编译的方式绑定参数,但是部分场景注入风险。
比如在使用QueryMapper中使用orderByASC,如果参数可控会存在SQL注入,相似的函数还有having、apply等拼接语句函数,因此如果在代码审计过程中关注到使用了MyBatis-Plus组件需要格外注意这些封装查询。