原生JDBC
原生JDBC的SQL查询下,SQL查询方法关键方法为:
java.sql.Statement // 没有预编译
java.sql.PreparedStatement // 有预编译
无论是否使用预编译,关注点:
- 是否有用占位符
- SQL语句是否存在拼接
Mybatis
对于Mybatis框架下:
- mapper.xml文件
直接全局搜$
符号,然后看参数类型是否为string和是否可控
- 普通注解
同xml文件的语法一样,直接搜$
符号即可
- Provider注解
需要跟进到Provider所提供的类中SQL语句具体工具类的实现方法,本质上还是看是否有预编译,大体存在两种情况:
- SQL对象方法构造(同原生JDBC查询)
- 通过字符串拼接的方式构造(同xml文件的写法)
- MyBatis generator
关注配置文件中targetRuntime
参数。这个参数有2种配置项,即 MyBatis3
和 MyBatis3Simple
,MyBatis3
为默认配置项。只有MyBatis3
配置才会出现不进行预编译的xml文件:
在使用MyBatis3
配置的情况下,关注没有预编译的方法中的参数是否可控:
addCriterion(String condition)
- 分页插件
setOrderBy(java.lang.String)
startPage(int,int,java.lang.String)
startPage(int,int,java.lang.String)
Mybatis Plus
- Wrapper条件构造器
apply(String applySql, Object... params)
apply(boolean condition, String applySql, Object... params)
last(String lastSql)
last(boolean condition, String lastSql)
exists(String existsSql)
exists(boolean condition, String existsSql)
notExists(String notExistsSql)
notExists(boolean condition, String notExistsSql)
having(String sqlHaving, Object... params)
having(boolean condition, String sqlHaving, Object... params)
orderBy(boolean condition, boolean isAsc, R... columns)
orderByDesc(R... columns)
orderByDesc(boolean condition, R... columns)
orderByAsc(R... columns)
orderByAsc(boolean condition, R... columns)
groupBy(R... columns)
groupBy(boolean condition, R... columns)
notInSql(boolean condition, R column, String inValue);
notInSql(R column, String inValue)
inSql(R column, String inValue)
inSql(boolean condition, R column, String inValue)
setSql(String sql)
setSql(boolean condition, String sql)
setOrderByClause(String orderByClause)
setTableName(String tableName)
- Wrapper 自定义SQL
跟传统的mybatis一样
- PaginationInnerInterceptor分页插件
page.setAsc();
page.setDesc();
page.setAscs();
page.setDescs();
page.setOrders();
page.addOrder();
tkMybatis
tkmybaits在传统mybatis的基础上增添了一些example的条件构造方法,关注参数为string类型且没有进行预编译的方法:
setOrderByClause(String condition)
setTableName(String tableName)
andCondition(String condition)
andCondition(String condition,Object value)
orCondition(String condition)
orCondition(String condition,Object value)
setAndOr(String condition)
Hibernate
createQuery
** / ****createNativeQuery
**方法
关注是否直接拼接外部可控参数
- Criterion查询
第一个参数是否可控
Restrictions.sqlRestriction(sql,value,type)
Spring Data Jpa
主要关注危险方法
JpaSort.unsafe()
entityManager.createNativeQuery()