Checkmarx показывает, что код имеет риски для внедрения второго порядка

Галочка отсканировала наши коды и показала, что этот код имеет риски для внедрения второго порядка кода, подобного этому.

@SuppressWarnings("unchecked")
public List<Map<String, Object>> findBySQL(String sql, List<ScalarType> types, List<Object> values, Info info) throws ApplicationException {
    try {
        SQLQuery query = currentSession().createSQLQuery(sql);
        if (types != null) {
            for (ScalarType scalar : types) {
                query.addScalar(scalar.getColumn(), scalar.getType());
            }
        }

        if (values != null) {
            for (int i = 0; i < values.size(); i++) {
                query.setParameter(i, values.get(i));
            }
        }
        query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
        return query.list();
    } catch (Exception e) {
        throw new ApplicationException(e, info);
    }
}

Наш код использует подготовленный оператор для выполнения sql. Но почему этот код все еще имеет риски, и как я могу это исправить?


person Yi-An Lin    schedule 29.01.2019    source источник
comment
Как эта функция может гарантировать, что sql и столбцы в types безопасны? Если вызывающий объект создает эти объекты с использованием небезопасного содержимого, результирующий запрос будет небезопасным. Я боюсь, что функция, подобная этой findBySQL(), которая принимает произвольный ввод, по своей сути является уязвимостью SQL-инъекций. Вы можете внести в белый список отдельные столбцы в вашем types списке, но весь запрос в sql не должен быть доверенным.   -  person Bill Karwin    schedule 29.01.2019
comment
Проблема начинается с того, что types может быть нулевым. На самом деле вообще избегайте этой функции.   -  person Joop Eggen    schedule 07.02.2019


Ответы (2)


Checkmarx выдает ошибку, потому что значения, которые вы устанавливаете для параметров запроса, не проверены для его типа.

Например, предположим, что запрос, сформированный с помощью вашего PreparedStatement, выглядит следующим образом, а значение, которое вы хотите передать параметру запроса, — «Тест».

Select * from XYZ where COL1 = ?

Если ваш код скомпрометирован и злоумышленник передает 'Test' OR 1 = 1 в параметре запроса, то условие всегда будет истинным и будет возвращать все записи из таблицы.

Итак, перед выполнением запроса вы должны проверить все свои входные данные.

Надеюсь это поможет

person Prasann    schedule 07.02.2019

Для решения вашей проблемы в Checkmarx вам необходимо проверить эту строку sql

person SPoint    schedule 07.02.2019