PageHelper 分页排序,引发sql注入

我们在开发时,分页通常使用的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/天,具体规则查看活动详情Blog Img