Невозможно смягчить инъекции SQL, используя OW ASP .ESAPI - Veracode - PullRequest
0 голосов
/ 22 января 2020

Я выполняю сканирование veracode для моего Java кода, и он выдает следующую ошибку в одном из моих классов DAO

Неправильная нейтрализация специальных элементов, используемых в команде SQL ('SQL Injection ') CWE ID 89

Однако я попытался смягчить это с помощью библиотеки OW ASP .ESAPI, поскольку я не могу использовать параметризованный ввод для структурирования своего запроса, так как я использую String Builder. Ниже приведен пример кода, над которым я пытаюсь работать

private static String getPhoneDataSql(QuerySearchType type, PhoneQueryParams queryParams){      
    StringBuilder sql = new StringBuilder("select * from users where ");
    List<String> sqls = new ArrayList<String>();

    if(StringUtils.isNotBlank(queryParams.getUserId())){
        sqls.add("USER_ID like ".concat(type.format(encodeSQLInput(queryParams.getUserId()))));
    }
    if(StringUtils.isNotBlank(queryParams.getUserName())){
        sqls.add(UNAME_LIKE.concat(type.format(encodeSQLInput(queryParams.getUserName()))));
    }
    if(StringUtils.isNotBlank(queryParams.getCompany())){
        sqls.add("STR_COMPANY like ".concat(type.format(encodeSQLInput(queryParams.getCompany()))));
    }   

    boolean firstAnd = false;
    for(String s : sqls){
        sql.append(firstAnd ? STR_SQL_LIKE : "").append(s);
        firstAnd = true;
    }
    return sql.toString();
}

private static String encodeSQLInput(String sqlInput){  
    Codec ORACLE_CODEC = new OracleCodec();
    if(sqlInput == null) {
        return "NULL";
    }   
    sqlInput = ESAPI.encoder().encodeForSQL( ORACLE_CODEC, sqlInput);
    return sqlInput;
}

Может кто-нибудь помочь?

1 Ответ

1 голос
/ 22 января 2020

SQL сканеры инъекций, такие как Veracode, обычно жалуются, если обнаруживают, что вы создаете SQL запросы путем конкатенации строк с переменными приложения. Они не могут определить, правильно ли вы экранировали содержимое в переменной приложения, чтобы сделать его безопасным.

Лучше избегать конкатенации строк, потому что так легко ошибиться и допустить внедрение SQL уязвимость случайно.

Вместо этого используйте параметры запроса. Вместо того, чтобы объединять ваши строки, оставьте заполнитель типа ? в вашей строке SQL и привяжите вашу переменную к выражению.

В документации много примеров: https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...