Исправление ошибки манипулирования путями

Fortify выдает ошибку Path Manipulation в строке, где выполняется сравнение нового файла (пути). Я использую Struts 2.

Может ли кто-нибудь сказать мне, как решить эту проблему, чтобы fortify не выдавал эту ошибку?

private boolean filePresent(String fileName) {
    if (fileName != null) {
        String path = getDirPath();
        if (path != null) {
            path = path.endsWith("/") ? path : path + "/";
            path = path + fileName;
            if (new File(path).exists()) {
                setFileName(fileName);
                return true;
            }
        }
    }
    return false;
}

Мне нужно увидеть, присутствует ли файл на нашем веб-сервере или нет, поэтому я передаю имя файла в качестве аргумента, получаю полный путь к каталогу из web.xml, добавляю его к имени файла, а затем составляю путь и проверяю его против объекта File, чтобы увидеть, присутствует ли он или нет.


person Mike    schedule 16.03.2012    source источник


Ответы (2)


Вы не хотите, чтобы удаленный веб-пользователь видел, существует ли C:/Windows/System32 или существует ли /etc/hosts, потому что это позволяет им проводить криминалистические исследования на вашем сервере.

Вы, вероятно, не осознавали, что ваша функция позволяет им делать именно это, включая соответствующее количество последовательностей «..» во входную строку.

Есть два способа остановить проблему:

  1. Подход к белому списку. Сотрите все символы во входном параметре и разрешите только от «a» до «z» и, возможно, «.» Вызовите исключение, если ввод выходит за эти границы.

1а. Или, если вы знаете, что список допустимых файлов меньше 20, просто перечислите их и, если ввод не соответствует точному совпадению, сгенерируйте исключение.

  1. Метод черного списка. Проверьте ввод и сгенерируйте исключение, если он содержит какую-либо последовательность «..» или косую черту или обратную косую черту. Это ВООБЩЕ не глубокая защита, но для вашей функции, как я сейчас прочитал, это было бы нормально.
person Douglas Held    schedule 31.03.2012
comment
Привет @Douglas, для нашего проекта мы используем черный список как (\\.\\.\\\\|\\\\|\\.\\./|/) Но я не понимаю, как его можно использовать как черный список, так и любой путь всегда будет иметь косую черту или обратную косую черту (извините, если вопрос слишком простой, учитывая, что я не так хорош в регулярных выражениях). - person Vicky; 31.05.2018
comment
Привет, Гаурав, речь идет не столько о регулярном выражении, сколько о ваших ожидаемых входных данных. Обратите внимание, что если getFilePath() возвращает D:\App\files и fileName = foo.txt, то существование D:\App\files\foo.txt будет проверено. Вы ожидаете вместо этого subdir\\foo.txt? Будете ли вы правильно обрабатывать subdir/foo.txt? Я не могу оценить ваш вопрос о регулярном выражении, если вы не предоставите фактическое выражение сравнения Java. - person Douglas Held; 31.05.2018

Вы даже можете использовать фильтр, чтобы сделать это как

в фильтре

chain.doFilter(new RequestWrapper((HttpServletRequest) request), response);

в RequestWarper используйте что-то вроде

if(value.contains("..\\"))
value = value.replace("..\\", "");
        if(value.contains("../"))
            value = value.replace("../", "");
        if(value.contains("./"))
            value = value.replace("./", "");
person Ponmudi VN    schedule 19.12.2013