Как определить, указывает ли относительный путь за пределы данного пути - PullRequest
3 голосов
/ 28 июня 2010

У меня есть следующий сценарий (C #, WinForms). У меня есть какой-то файл проекта, который сохраняется в каком-то каталоге. Файл проекта содержит ссылку на другой файл. Эта ссылка является относительной от места сохранения файла проекта.

Пример: файл проекта сохраняется в папке c: \ projects \ project.xyz. Другой файл называется "\ someotherdir \ file.abc".

Это работает нормально, но может быть кто-то пытался манипулировать этим относительным путем к чему-то вроде ".. \ Windows \ System32 \ file.abc". Поэтому необходимо проверить, указывает ли относительный путь за пределы пути, в котором сохранен проект (это определенное требование, чтобы все ссылочные файлы были внутри пути проекта).

Как обнаружить этот сценарий?

Ответы [ 3 ]

4 голосов
/ 28 июня 2010

Вы можете попробовать использовать следующий метод расширения:

public static bool IsChildOf(this string path, string parentPath)
{
    return Path.GetFullPath(path).StartsWith(Path.GetFullPath(parentPath),
           StringComparison.InvariantCultureIgnoreCase);
}
2 голосов
/ 28 июня 2010

Не очень красиво, но я думаю, что это должно работать.

if (System.IO.Path.GetFullPath(path).IndexOf(projectPath, StringComparison.CurrentCultureIgnoreCase) == -1)
{
  // naughty
}

Отредактировано, чтобы быть хорошим гражданином мира.

1 голос
/ 28 июня 2010

Windows имеет символические ссылки posix: ln -s c:\windows\system32\mshtml.dll c:\projects\project.xyz\innocent.txt.Когда ваша программа открывает c:\projects\project.xyz\innocent.txt, вы получаете c:\windows\system32\mshtml.dll.System.IO.Path.GetFullPath() здесь работает?

POSIX также поддерживает жесткие ссылки.Файл может иметь ноль (при удалении), один, два, десять, сто имен файлов.И все это «Имя файла», не более правильное или менее правильное, чем любое другое.

Windows поддерживает монтирование папок в папки.Опять же, все имена верны.

Вы можете решить это с разрешениями файловой системы: создайте нового пользователя для своего приложения.Дайте этому пользователю права доступа к пути вашего проекта.Не предоставляйте этому пользователю (или «Все», или любые группы, в которых он участвует) права на что-либо еще в любой файловой системе.Позвольте команде ядра Microsoft решить вашу проблему за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...