Код веб-приложения 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 ответ

В статье Википедии о обходе пути есть предлагаемый метод предотвращения этого:

  1. Прежде чем продолжить, обработайте запросы URI, которые не приводят к запросу файла, например, выполнение перехвата в коде пользователя.
  2. Когда должен быть сделан запрос URI для файла / каталога, создайте полный путь к файлу / каталогу, если он существует, и нормализуйте все символы (например, %20 преобразованы в пробелы).
  3. Предполагается, что известен полный нормализованный путь "Корень документа", и эта строка имеет длину "N". Предположим, что никакие файлы вне этого каталога не могут обслуживаться.
  4. Убедитесь, что первые "N" символов полного пути к запрошенному файлу точно такие же, как "Корень документа".
  5. Если да, разрешите возврат файла.
  6. Если нет, вернуть ошибку, поскольку запрос явно выходит за рамки того, что веб-серверу должно быть разрешено обслуживать.

Итак, вы должны создать второй файловый объект из DOWNLOAD_PATH, затем используйте getCanonicalPath чтобы увидеть, что путь к загружаемому файлу начинается с пути к каталогу загрузки.

После этого вы должны добавить @SuppressWarnings аннотация к методу, чтобы скрыть предупреждения, которые теперь обрабатываются правильно.

Другие вопросы по тегам