大苹果xoxo 2020-02-06 14:01 采纳率: 0%
浏览 853
已结题

Fortify检测sql注入问题 order by动态拼接注入漏洞

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检测出来的漏洞
图片说明

  • 写回答

2条回答

  • dabocaiqq 2020-02-06 15:01
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示