Как убедиться, что путь к файлу безопасен в C #? - PullRequest
4 голосов
/ 18 ноября 2009

У меня есть приложение asp.net mvc с маршрутом, который позволяет пользователям запрашивать файлы, которые хранятся вне каталога веб-приложения.

Я упросту сценарий, просто сказав вам, что в конечном итоге он будет ограничен безопасным каталогом, к которому они имеют полный доступ.

Например:

Если пользователь (чей ID равен 100) запрашивает:

http://mysite.com/Read/Image/Cool.png

тогда мое приложение добавит «Cool.png» в «C: \ ImageRepository \ Users \ 100 \» и запишет эти байты в ответ. Рабочий процесс имеет доступ к этому пути, а анонимный пользователь - нет. У меня уже есть эта работа.

Но сможет ли какой-нибудь злонамеренный пользователь запросить что-то вроде:

http://mysite.com/Read/Image/..\101\Cool.png

и разрешить его на

"C:\ImageRepository\Customers\101\Cool.png"

(изображение другого пользователя?!)

Или что-то в этом роде? Есть ли способ убедиться, что путь чист, чтобы пользователь был ограничен собственным каталогом?

Ответы [ 5 ]

4 голосов
/ 18 ноября 2009

Как насчет

var fileName = System.IO.Path.GetFileName(userFileName);
var targetPath = System.IO.Path.Combine(userDirectory, fileName);

Это должно гарантировать, что вы получите только простое имя файла.

0 голосов
/ 14 мая 2012

Чтобы также иметь возможность включить подкаталог в путь, который вы можете использовать:

string SafeCombine(string basePath, string path)
{
    string testPath = Path.GetFullPath(Path.Combine(basePath, path));
    if (testPath.startsWith(basePath))
        return testPath;
    throw new InvalidOperationException();
}
0 голосов
/ 18 ноября 2009

Использование перегрузки Request.MapPath - один из способов проверить это:

try
{
  string mappedPath = Request.MapPath( inputPath.Text,                                  Request.ApplicationPath, false);
}
catch (HttpException)
{
  // do exception handling
}

Также вы можете разбить строку и разделить ее косыми чертами, а также проверить соответствие имени пользователя.

0 голосов
/ 18 ноября 2009

Самый безопасный способ, если это вариант (вы используете проверку подлинности Windows), это сделать его без проблем, используя права Active Directory на папки, чтобы не имело значения, пытается ли пользователь получить доступ к каталогу. это недействительно.

Если это не так, сохраняйте файлы так, чтобы путь был абстрагирован от пользователя. То есть, используйте любое имя, которое пользователь предоставляет для поиска в таблице, имеющей РЕАЛЬНЫЙ путь к файлу.

Защита от канно-локализации - сложная задача, и опасно пытаться перехитрить потенциального злоумышленника.

0 голосов
/ 18 ноября 2009

Возможно, вам следует убедиться, что путь начинается с пути к каталогу пользователя?

например. "C:\ImageRepository\Customers\100\"

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

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