我们在开发时,分页通常使用的PageHelper分页插件
但是在使用该插件时,如果使用到了排序,如果不对该排序进行处理,会造成sql注入,存在巨大的安全隐患!
我们查看源码,发现排序字段是以sql拼接的形式,因此有巨大的安全隐患,以下为源码片段
public static String converToOrderBySql(String sql, String orderBy) {
Statement stmt = null;
try {
stmt = CCJSqlParserUtil.parse(sql);
Select select = (Select) stmt;
SelectBody selectBody = select.getSelectBody();
List<OrderByElement> orderByElements = extraOrderBy(selectBody);
String defaultOrderBy = PlainSelect.orderByToString(orderByElements);
if (defaultOrderBy.indexOf('?') != -1) {
throw new RuntimeException("[" + sql + "]");
}
sql = select.toString();
} catch (Throwable e) {
e.printStackTrace();
}
return sql + " order by " + orderBy;
}
为避免这种情况,我们可以对排序字段进行验证,下面的方法是我对获得排序字段进行验证,大家可以测试下
public String getSortField() {
if(null!=sortField) {
Type type = getClass().getGenericSuperclass();
Type[] parameterizedType = ((ParameterizedType) type).getActualTypeArguments();
entityClass = ((Class<T>) parameterizedType[0]);
try {
entityClass.getDeclaredField(lineToHump(sortField)).getName();
} catch (NoSuchFieldException | SecurityException e) {
// TODO Auto-generated catch block
return "-1";
}
}
return sortField;
}
爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情