Галочка отсканировала наши коды и показала, что этот код имеет риски для внедрения второго порядка кода, подобного этому.
@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. Но почему этот код все еще имеет риски, и как я могу это исправить?
sql
и столбцы вtypes
безопасны? Если вызывающий объект создает эти объекты с использованием небезопасного содержимого, результирующий запрос будет небезопасным. Я боюсь, что функция, подобная этойfindBySQL()
, которая принимает произвольный ввод, по своей сути является уязвимостью SQL-инъекций. Вы можете внести в белый список отдельные столбцы в вашемtypes
списке, но весь запрос вsql
не должен быть доверенным. - person Bill Karwin   schedule 29.01.2019types
может быть нулевым. На самом деле вообще избегайте этой функции. - person Joop Eggen   schedule 07.02.2019