Уязвимость обхода пути в ядре asp.net

Я уже пробовал эти решения

Предотвращает ли мой код обход каталога в C#?

Возможны ли уязвимости обхода пути в приведенном ниже коде?

Как предотвратить обход пути в .NET

Как избежать обхода каталога в моем коде

Но тем не менее, сканирование Checkmarx создает проблему безопасности, ниже приведен код

public FileContentResult GetImageFromFilePath(string filePath)
        {
            byte[] image = null;
            if (!string.IsNullOrEmpty(filePath))
            {
                image = System.IO.File.ReadAllBytes(filePath);
            }
            if (image == null)
                return null;
            return File(image, "image/jpeg");
        }

Проблема в этой строке кода image = System.IO.File.ReadAllBytes(filePath);

Пожалуйста, дайте мне знать, как решить эту проблему безопасности.

Заранее спасибо.


person gaurav bhavsar    schedule 31.03.2021    source источник
comment
См. этот ответ: stackoverflow.com/a/4535684/224370 Никогда не следует доверять пользовательскому вводу для создания пути к файлу на сервер.   -  person Ian Mercer    schedule 31.03.2021
comment
Похоже на действие контроллера MVC? Проблема безопасности заключается в том, что технически кто-то может передать C:\link\to\private\database, и вы вернете ему базу данных. Решение состоит в том, чтобы никогда не иметь конечной точки, которая использует путь к файловой системе, лучше рассматривать любые файлы, которые вы обслуживаете, как активы и хранить их в решении.   -  person Callum Morrisson    schedule 31.03.2021


Ответы (1)


Path Traversal заключается в том, что вы строите путь на основе пользовательского ввода, в основном у вас есть предположение о пользовательском вводе, например, пользователь дает вам year и index, и вы возвращаете правильное изображение: $"App/Photos/${year}/${index}.png".

обход заключается в том, что пользователь дает вам относительную часть, например, для year- ../private, так что путь будет App/private/1.png.

Чтобы очистить этот пример (и вам нужно подумать о большем количестве случаев и не делать никаких предположений), вам нужно использовать filePath.Replace("..", ""). перед использованием filePath для доступа к файловой системе.

person baruchiro    schedule 31.03.2021
comment
Работает, я заменил /../, никогда не думал заменить просто .. офигенно. - person gaurav bhavsar; 31.03.2021