проверка сохраненного абсолютного обхода пути

#java #checkmarx #secure-coding #path-traversal #sast

Вопрос:

Мы пытаемся исправить некоторые проблемы, о которых сообщает checkmarx, я должен сказать, что проблему с сохранением серийного номера xxx трудно найти решение.

По этому поводу у нас есть следующий код

 PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
entity.setFilePath(org.owasp.encoder.Encode.forJava(rs.getString("FilePath"))
}
rs.close();
ps.close();

return entity;
 

Затем я использую сущность, подобную этой:

 entity = dao.getEntity();
inputStream = new FileInputStream(entity.getFilePath());
 

Checkmarx все еще сообщает о проблеме в строке inputSteam, но я уже кодирую ее перед возвращением сущности. Как я могу решить подобную проблему?

Ответ №1:

Выходное кодирование пути к файлу может не обязательно помочь вам предотвратить обход пути. Ваше решение SAST предполагает, что данные из БД испорчены, и поэтому один из способов снизить этот риск-заменить строку потенциально вредоносных символов

 if (rs.next()) {
   entity.setFilePath(rs.getString("FilePath").replace("\",""))
}
 

Другой способ-просто сохранить имя файла (то есть, если путь задан заранее), а путь канонизирован с помощью метода getCanonicalPath