CAT.NET Дезинфицировать путь к файлу перед передачей его в сообщение подпрограмм файловой системы

Я анализирую свой код (C#, настольное приложение) с помощью анализа кода CAT.NET и получаю сообщение «Очистить путь к файлу перед его передачей в подпрограммы файловой системы» при работе с именами файлов. Чего я не понимаю, так это того, что для проверки правильности имени файла я использую:

void SomeMethod(String filename)
{
    filename = System.IO.Path.GetFullPath(filename);
    // ... Do stuff
}

Разве это не «волшебное решение» для решения проблем с недопустимыми именами файлов? Я читал нечто подобное здесь (первый ответ), но в моем случае я имею дело только с локальными файлами, ну, что-то очень простое, так что...

Итак, почему я получаю это сообщение и как его избежать?


person Arseni Mourzenko    schedule 31.12.2009    source источник


Ответы (2)


Я знаю, что это старый вопрос, но я только что наткнулся на что-то, что может быть полезно, особенно в связи с сообщением об ошибке CAT.Net.

В сообщении блога о правилах потока данных CAT.Net, они говорят следующее о FileCanonicalizationRule:

Описание

Пользовательский ввод, используемый в процедурах обработки файлов, потенциально может привести к уязвимости канонизации файлов. Код особенно восприимчив к проблемам канонизации, если он принимает какие-либо решения на основе имени ресурса, которое передается программе в качестве входных данных. Файлы, пути и URL-адреса — это типы ресурсов, уязвимые для канонизации, поскольку в каждом случае существует много разных способов представления одного и того же имени.

Разрешение

Очистите путь к файлу, прежде чем передавать его процедурам обработки файлов. Используйте Path.GetInvalidFileNameChars или Path.GetInvalidPathChars, чтобы получить недопустимые символы и удалить их из ввода. Дополнительную информацию можно найти по адресу http://msdn.microsoft.com/en-us/library/system.io.path.getinvalidfilenamechars.aspx.

Поэтому они предлагают вам использовать Path.GetInvalidFileNameChars и Path.GetInvalidPathChars для проверки ваших путей.

Обратите внимание, что они предлагают удалить недопустимые символы. Хотя это действительно сделает путь действительным, это может привести к неожиданному поведению пользователя. Поскольку комментарии к этому вопросу/ответу предполагают, что, вероятно, лучше выйти раньше и сообщить пользователю, что его путь недействителен, а не чем делать что-то неожиданное с их вводом (например, удалять плохие символы и использовать модифицированную версию).

person Richard Marskell - Drackir    schedule 21.03.2012

Если имя файла исходит от пользователя, это может быть что-то вроде «../../../../etc/passwd» — сообщение об ошибке говорит вам, что вам нужно очистить его, чтобы он не мог получить к каталогам это не предполагается.

person Annie    schedule 31.12.2009
comment
Именно поэтому я использую Path.GetFullPath, который преобразует путь типа C:\SomeStuff\ChildDirectory\..\..\FileHere.txt в C:\FileHere.txt. - person Arseni Mourzenko; 31.12.2009
comment
И это огромный риск для безопасности, если пользователь введет путь — он может получить доступ / перезаписать файлы в каталогах, к которым им не должно быть разрешено прикасаться. В вашем примере вы предполагаете, что файл будет в C:\SomeStuff\ChildDirectory, но на самом деле они обращаются к файлу в C:\. - person Annie; 31.12.2009
comment
Я действительно не понимаю. Path.GetFullPath(C:\SomeStuff\ChildDirectory\..\..\FileHere.txt) дает C:\FileHere.txt. Поэтому, вызывая GetFullPath() в начале каждого метода (при необходимости) и используя его результат, я в безопасности. Или нет? - person Arseni Mourzenko; 31.12.2009
comment
Если вы просто вызываете GetFullPath с заданным пользователем именем файла, вы разрешаете пользователю доступ к любому пути на машине, а не только к путям, к которым он должен получить доступ. Например, предположим, что ваше приложение позволяет пользователям загружать изображения и сохраняет их в каталоге c:\MyApp\Images с именем, указанным пользователем. Они указывают имя ..\..\Windows\explorer.exe и перезаписывают C:\Windows\explorer.exe трояном. Поэтому вам нужно очистить такие вещи, как ..\, вместо того, чтобы просто принимать их в GetFullPath(). - person Annie; 02.01.2010