Поделиться через


Основы безопасности платформы .NET Framework

Компонент управления доступа для кода является частью платформы .NET Framework и обеспечивает управление доступом к ресурсам путем контроля выполняемого кода.Этот компонент системы безопасности отделен от системы безопасности операционной системы и дополняет ее возможности.

Принцип работы

Когда пользователь запускает приложение, среда CLR платформы .NET Framework назначает ему зону.Существует пять зон.

Зона

Описание

Мой компьютер

Код приложения находится на компьютере пользователя.

Local Intranet

Код приложения выполняется из общей папки в интрасети пользователя.

Internet

Код приложения выполняется из Интернета.

Надежные узлы

Это приложения из узлов, относящихся к надежным узлам в обозревателе Internet Explorer.

Веб-узлы без доверия

Это приложения из узлов, относящихся к зоне ограниченных узлов в обозревателе Internet Explorer.

Назначение первых трех зон, Мой компьютер, Локальная интрасеть и Интернет определяется местом размещения кода.В обозревателе Internet Explorer можно переопределить назначение конкретных узлов, помещая их в зоны надежных или ограниченных узлов.

Каждая из этих зон имеет особые права доступа, определяемые системным администратором.Уровень безопасности зоны может иметь значение полного уровня доверия, среднего уровня доверия, низкого уровня доверия или отсутствия доверия.Уровни доверия определяют ресурсы, доступные приложениям.Зона, вместе с другими свидетельствами безопасности, такими как издатель, строгое имя, веб-узел и URL-адрес кода, определяют разрешения, предоставляемые коду во время выполнения.(Дополнительные сведения о свидетельствах безопасности см. в разделе Свидетельство.) Разработчик не может влиять на параметры безопасности на компьютере пользователя, однако приложение должно работать при тех значениях параметров, которые будут существовать во время его выполнения.Это может означать, что приложению будет отказано в доступе к отдельным ресурсам.Например, приложению может понадобиться записать данные в файл, а система пользователя отклонит доступ на запись во время выполнения и создаст исключение.

Ваша задача заключается в том, чтобы разрабатываемое приложение могло обработать такую ситуацию.Это не обязательно означает, что приложение должно найти другой способ записать данные.Это означает, что в приложении необходимо предусмотреть ситуацию, в которой оно не сможет записывать данные, и реагировать на нее должным образом.Чтобы повысить надежность кода, можно воспользоваться несколькими вариантами обработки исключений или некоторыми объектами в пространстве имен System.Security.Permissions.Краткое описание этих методов находится в последнем разделе "Разработка для сред с частичным доверием" этого документа.

Уровни безопасности для зон определяются с использованием установленных средств администрирования после установки платформы .NET Framework.Дополнительные сведения о задании уровней безопасности для зон на компьютере см. в разделе Средства администрирования.

Full Trust

Разработчики часто работают в среде полного доверия.Исходный код хранится на жестких дисках, а тестирование приложений выполняется на компьютерах разработчиков.В такой среде полного доверия любому коду, создаваемому разработчиком, разрешен запуск на локальном компьютере.Исключения безопасности не возникают, поскольку локальный компьютер по умолчанию является средой полного доверия.

Частичное доверие

Частичное доверие описывает все зоны, которые не является зонами полного доверия.При развертывании приложения оно может быть помещено в другую зону, в которой приложению, возможно, не предоставляется полное доверие.Вот две типичных ситуации, в которых код запускается в зоне частичного доверия:

  • выполнение кода, загруженного из Интернета;

  • выполнение кода, который находится на общем сетевом ресурсе (в интрасети).

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

  • операции файлового ввода-вывода, включая чтение, запись, создание, удаление или печать файлов;

  • системные компоненты, такие как параметры реестра и переменные среды;

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

Что не разрешается в зоне частичного доверия?Определить это нелегко.Каждый класс и каждый метод каждого класса .NET Framework имеет атрибут безопасности, который определяет уровень доверия, который необходим для выполнения этого метода, и этот атрибут может быть недоступным во время выполнения как раз из-за средств безопасности.Уровень зоны — это не просто сопоставление уровня доверия с атрибутами, а коллекция конкретных разрешений, предоставляемых конкретным классам и методам.В приложении невозможно просто запросить уровень доверия, а затем получить возможность узнать, какие ресурсы, будут недоступны.Однако можно определить, выполняется ли приложение в режиме полного доверия или нет.Один из способов описан в следующем разделе "Разработка для сред частичного доверия".

Разработка для сред частичного доверия

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

Код исключения безопасности

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

Public Sub MakeABitmap()
    Dim b As New System.Drawing.Bitmap(100, 100)
    ' Some code here to draw a nice picture in the bitmap
    b.Save("c:\PrettyPicture.bmp")
End Sub
public void MakeABitmap()
{
    System.Drawing.Bitmap b =
        new System.Drawing.Bitmap(100, 100);
    // Some code here to draw a nice picture in the bitmap
    b.Save("c:\\PrettyPicture.bmp");
}

Этот метод выполняется без создания исключения, если проект и сборка проекта хранятся на жестком диске компьютера, и если вы являетесь членом группы "Администраторы" на компьютере.При развертывании этого приложения в интрасети исключение SecurityException может быть создано, когда приложение попытается сохранить объект точечного рисунка.Если этот код не заключен в блок Оператор Try... Catch... Finally (Visual Basic) или try-catch-finally (C# Reference), работа приложения будет завершена с исключением.Такой ход событий пользователю может не понравиться.Если добавить код обработки исключений, приложение сможет:

  • предупредить пользователя о том, что приложение не может выполнить все необходимые задачи;

  • очистить существующие объекты, чтобы не произошло сбоя кода, выполняемого после блока Catch.

Можно изменить код сохранения точечного рисунка, как показано ниже.Добавленный код предупреждает пользователя о том, что система безопасности не позволила сохранить файл, и отделяет нарушения безопасности от других ошибок файлового ввода-вывода, например неверных имен файлов.Этот метод не создает слабых мест в системе безопасности.Либо пользователь изменит уровень безопасность для приложения, либо приложение не будет работать.

Public Sub MakeABitmap()
    Dim b As System.Drawing.Bitmap = Nothing
    Try
        b = New System.Drawing.Bitmap(100, 100)
        b.Save("c:\PrettyPicture.bmp")
    Catch ex As System.Security.SecurityException
        ' Let the user know the save won't work. 
        MessageBox.Show("Permission to save the file was denied, " & 
               "and the bitmap was not saved.")
    Catch ex As System.Exception
        ' React to other exceptions here.
        MessageBox.Show("Unable to create and save the bitmap.")
    End Try
End Sub
public void MakeABitmap()
{
    System.Drawing.Bitmap b = null;

    try
    {
        b = new System.Drawing.Bitmap(100, 100);
        b.Save("c:\\PrettyPicture.bmp");
    }
    catch (System.Security.SecurityException ex)
    {
        // Let the user know the save won't work. 
        MessageBox.Show("Permission to save the file was denied, " +
            "and the bitmap was not saved.");
    }
    catch (System.Exception ex)
    {
        // React to other exceptions here.
        MessageBox.Show("Unable to create and save the bitmap.");
    }
}

Классы, атрибуты и перечисления из пространства имен System.Security.Permissions обеспечивают даже больший уровень контроля над задачами безопасности в приложении.При разработке библиотек, которые могут быть вызваны другими приложениями, может потребоваться обеспечить проверку разрешения вызывающего кода в библиотеке.Например, можно просто добавить следующий атрибут уровня сборки в начало файла кода или в файл AssemblyInfo.vb или AssemblyInfo.cs.Дополнительные сведения см. в разделе Настройка атрибутов сборки.

<Assembly: System.Security.Permissions.FileIOPermissionAttribute( 
    System.Security.Permissions.SecurityAction.RequestMinimum, 
    Write:="c:\PrettyPicture.bmp")> 
[assembly: System.Security.Permissions.FileIOPermissionAttribute(
    System.Security.Permissions.SecurityAction.RequestMinimum,
    Write = "c:\\PrettyPicture.bmp")]

Среда выполнения проверяет разрешения при загрузке сборки.Если среда выполнения запрещает запрошенное разрешение, загрузка сборки завершается ошибкой и создается исключение безопасности.Если добавить этот атрибут в изолированное приложение, приложение может не запуститься.Если этот атрибут присутствует в библиотеке классов, библиотека может не загрузиться во время выполнения.Необходимо добавить блок Try/Catch в код, который вызывает библиотеку классов.

Можно также специально запросить разрешения в среде выполнения, как показано ниже, с помощью метода Demand.Среда выполнения может либо предоставить, либо отклонить запрос.Запрос отклоняется путем создания исключения безопасности.Можно переписать код, как показано ниже, чтобы явно потребовать разрешения на запись файла растрового изображения.

Public Sub MakeABitmap()
    Dim b As System.Drawing.Bitmap = Nothing
    Dim filename = "c:\PrettyPicture.bmp"
    Dim permission As New System.Security.Permissions.FileIOPermission( 
        System.Security.Permissions.FileIOPermissionAccess.Write, 
        filename)

    Try
        permission.Demand()
        Try
            b = New System.Drawing.Bitmap(100, 100)
            b.Save(filename)
        Catch ex As System.Exception
            MessageBox.Show("Unable to create and save the bitmap.")
        End Try
    Catch ex As System.Security.SecurityException
        ' Let the user know the save won't work. 
        MessageBox.Show("Permission to save the file was denied, " & 
               "and the bitmap was not saved.")
    Catch ex As System.Exception
        ' React to other exceptions here.
        MessageBox.Show("Other error.")
    End Try
End Sub
public void MakeABitmap()
{
    System.Drawing.Bitmap b = null;
    string filename = "c:\\PrettyPicture.bmp";

    System.Security.Permissions.FileIOPermission permission;
    permission = new System.Security.Permissions.FileIOPermission(
        System.Security.Permissions.FileIOPermissionAccess.Write, filename);

    try
    {
        permission.Demand();
        try
        {
            b = new System.Drawing.Bitmap(100, 100);
            b.Save(filename);
        }
        catch (System.Exception ex)
        {
            MessageBox.Show("Unable to create and save the bitmap.");
        }
    }
    catch (System.Security.SecurityException ex)
    {
        // Let the user know the save won't work. 
        MessageBox.Show("Permission to save the file was denied, " +
               "and the bitmap was not saved.");
    }
    catch (System.Exception ex)
    {
        // React to other exceptions here.
        MessageBox.Show("Other error.");
    }
}

Тестирование

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

См. также

Задачи

Практическое руководство. Выполнение не вполне безопасного кода в изолированной среде

Практическое руководство. Запрос минимальных разрешений с помощью флага RequestMinimum

Основные понятия

Управление доступом для кода

Правила написания безопасного кода

Изменения системы безопасности в платформе .NET Framework 4