Разрешения на запись каталог Регистрация


Рассмотрим следующий метод, который я для проверки разрешения на запись в каталог:

/// <summary>
/// Check existence and write permissions of supplied directory.
/// </summary>
/// <param name="directory">The directory to check.</param>
protected static void CheckPermissions(string directory)
{
    if (!Directory.Exists(directory))
    {
        throw new DirectoryNotFoundException(String.Format(JobItemsStrings.Job_DirectoryNotFound, directory));
    }

    // Check permissions exist to write to the directory.
    // Will throw a System.Security.SecurityException if the demand fails.
    FileIOPermission ioPermission = new FileIOPermission(FileIOPermissionAccess.Write, directory);
    ioPermission.Demand();
}

При запуске FxCop, этот код бросает вверх "CA2103 - комментарий императив безопасности" предупреждение, пусть и с вероятностью 25%, с этой информацией:

"Использование императивного требования может привести к непредвиденных проблем в области безопасности. В значений, используемых для создания разрешения не должно меняться в пределах вызов спроса. Для некоторых компонентов область простирается от звонка спрос до конца метод; для других это охватывает требовать до тех пор, пока компонент будет завершена. Если значения используется для создания разрешения полей или свойств, они могут быть изменено в пределах объема спроса вызова. Это может привести к гонке условия, изменяемые только для чтения массивов, и проблемы с упакованные типы значений."

Фактически, это FxCop быть слишком осторожный, или я делаю это неправильно?



9406
2
задан 29 января 2011 в 09:01 Источник Поделиться
Комментарии
2 ответа

Это предупреждение FxCop является в основном спрашивают вас, чтобы убедиться ("обзор"), что это непостоянно, вы передаете (директории) безопасности разрешение не меняется, а разрешение в силе. В основном, FxCop не уверен, если это возможно для код (или какой-либо модуль нищеброды, что хакер поставил на место), чтобы сделать что-то вроде следующего:


  1. Набор каталогов для "c:\Temp\"

  2. .Спрос()

  3. Набор каталогов для "c:\Windows\System32\"

  4. Написать что-нибудь в файл, содержащийся в каталоге.

В данном конкретном случае, поскольку каталог - это не ref параметр, это не возможно для другой модуль за пределами вашего звонка-потомков, чтобы изменить его. Таким образом, то, что вам нужно проверить:


  • Ничего в этом методе определения стоимости каталогов

  • Ничего в этом методе, который проходит каталог по ссылке (ссылка/из/небезопасные указатели)

Отказ от ответственности: я не эксперт по безопасности кода и не имеют никакого формального обучения как такового. Я, возможно, пропустили целые классы вещей, чтобы искать здесь. Если вы имеете дело с кодом, который имеет реальные последствия для безопасности, я настоятельно рекомендую вам нанять консультанта, который делает, а не то, что я написал выше, как Евангелие.

3
ответ дан 30 января 2011 в 10:01 Источник Поделиться

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

Разрешения (или существование) из файла/каталога может измениться между раз, когда вы проверить и время операции вызывается (новое разрешение fileiopermission(...) в данном случае). Эта ситуация является более распространенным, чем кажется.

0
ответ дан 2 февраля 2011 в 07:02 Источник Поделиться