java服务,使用spring jdbc做持久化层,数据库使用oracle,在做分页sql拼接的代码被Fortify检测出来问题,甲方要求必须整改。
检测代码源如下:
private static String getPagerSql(String sourceSql, Pager<Map<String, Object>> pager) {
StringBuffer toSql = new StringBuffer();
toSql.append("select * from ( select row_.*, rownum rownum_ from ( ");
toSql.append(sourceSql);
toSql.append(" order by ");
for (Sort orderBy : pager.getSort()) {
toSql.append(String.format("%s %s,", orderBy.getProperty(), orderBy.getDir()));
}
toSql.deleteCharAt(toSql.length() - 1);
toSql.append(" ) row_ ) where rownum_ > ? and rownum_ <= ? ");
return toSql.toString();
}
主要问题是在动态拼接排序参数被检测出来问题,虽然排序参数做了排序字段和排序顺序过滤,但还是被检测出高危注入漏洞,代码如下:
/**
* 获取排序参数
* @return
*/
public List<Sort> getSort() {
String[] sortnames=this.getSortname().split(",");
String[] sortordes=this.getSortorder().split(",");
if(sortnames.length!=sortordes.length) {
throw new IllegalArgumentException("分页多重排序参数中,排序字段与排序方向的个数不相等");
}
String regex = "^[a-z0-9A-Z_]{1,20}";
for(String sortname:sortnames) {
if(!sortname.matches(regex)) {
throw new IllegalArgumentException("分页排序参数中,排序字段非法");
}
}
List<Sort> orders = new ArrayList<Sort>();
for (int i = 0; i < sortnames.length; i++) {
if(!(Sort.ASC.equals(sortordes[i].toLowerCase())||Sort.DESC.equals(sortordes[i].toLowerCase()))) {
throw new IllegalArgumentException("分页排序参数中,排序方向非法");
}
orders.add(new Sort(sortnames[i], sortordes[i]));
}
return orders;
}
请问有什么办法解决这个被Fortify检测出来的漏洞