Код веб-приложения Java возвращается с проблемой обхода пути при тестировании в боте
Итак, мне дали задание исправить проблему обхода пути в базовом веб-приложении Java, но я застрял. Мы призваны, по сути, гарантировать безопасность кода, сохраняя при этом функциональность (это та часть, с которой я борюсь)
До сих пор я смотрел в Интернете, как исправить возникающие проблемы, и мне удалось их исправить, но бот, который проверяет код, возвращается с сообщением о том, что приложение больше не имеет функциональности, но безопасно.
Я получаю следующие 2 ошибки:
1) PATH_TRAVERSAL_IN в FileDownload. java исходный файл FileDownload. Имя класса java chatapp. Имя метода FileDownload doGetSource Line 31
2) PT_RELATIVE_PATH_TRAVERSAL в FileDownload. java исходный файл FileDownload. Имя класса java chatapp. Имя метода FileDownload doGet Source Line 28
Для справки, этот код является оригинальным, в котором он функционирует, но он небезопасен.
private String DOWNLOAD_PATH = new File(".").getCanonicalPath() +
"/webapps/webapp/app/download";
public FileDownload() throws IOException {
}
public void init() throws ServletException {
//To Do
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
!!!String file = request.getParameter("file");
String downloadPath = DOWNLOAD_PATH + "/" + file;
!!!File downloadFile = new File(FilenameUtils.getName(downloadPath));
if (downloadFile.exists()) {
response.setContentType("application/octet-stream");
response.setHeader("Content-disposition", "attachment; filename="+ downloadFile.getName());
FileInputStream fis = new FileInputStream(downloadFile);
byte[] data = new byte[(int) downloadFile.length()];
fis.read(data);
fis.close();
OutputStream out = response.getOutputStream();
out.write(data);
out.flush();
}
else
response.sendError(404);
}
Есть ли у кого-нибудь опыт решения подобных проблем? Я немного запутался
1 ответ
В статье Википедии о обходе пути есть предлагаемый метод предотвращения этого:
- Прежде чем продолжить, обработайте запросы URI, которые не приводят к запросу файла, например, выполнение перехвата в коде пользователя.
- Когда должен быть сделан запрос URI для файла / каталога, создайте полный путь к файлу / каталогу, если он существует, и нормализуйте все символы (например,
%20
преобразованы в пробелы).- Предполагается, что известен полный нормализованный путь "Корень документа", и эта строка имеет длину "N". Предположим, что никакие файлы вне этого каталога не могут обслуживаться.
- Убедитесь, что первые "N" символов полного пути к запрошенному файлу точно такие же, как "Корень документа".
- Если да, разрешите возврат файла.
- Если нет, вернуть ошибку, поскольку запрос явно выходит за рамки того, что веб-серверу должно быть разрешено обслуживать.
Итак, вы должны создать второй файловый объект из DOWNLOAD_PATH
, затем используйте getCanonicalPath
чтобы увидеть, что путь к загружаемому файлу начинается с пути к каталогу загрузки.
После этого вы должны добавить @SuppressWarnings
аннотация к методу, чтобы скрыть предупреждения, которые теперь обрабатываются правильно.