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

Основанная на свидетельстве безопасность и управление доступом для кода предоставляют мощные полноценные механизмы обеспечения безопасности. Для большей части кода приложения достаточно просто использовать инфраструктуру, реализуемую NET Framework. В некоторых случаях для приложений требуется специальная защита, построение которой осуществляется либо за счет расширения системы безопасности, либо за счет использования новых специальных методов.

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

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

ПримечаниеПримечание

В версии .NET Framework 4 произошли серьезные изменения терминологии и модели безопасности платформы .NET Framework. Дополнительные сведения об этих изменениях см. в разделе Изменения системы безопасности в платформе .NET Framework 4.

Нейтральный код

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

У нейтральной библиотеки есть некоторые особенности, о которых следует знать. Допустим, библиотека предоставляет API-элементы, использующие файлы или вызывающие неуправляемый код; если у кода нет соответствующего разрешения, он не будет работать, как задумано. Но, даже если у кода есть все разрешения, для его нормальной работы нужно, чтобы и у кода приложения, вызывающего данный код, были те же разрешения. Если у вызывающего кода нет необходимых разрешений, при проверке стека управлением доступом для кода генерируется исключение SecurityException.

Код приложения, не являющийся повторно используемым компонентом

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

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

Реализация управляемой оболочки для машинного кода

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

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

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

Этот подход к безопасному кодированию открывает наибольшие возможности, и, следовательно, при неправильной реализации он потенциально наиболее опасен. Ваша библиотека служит интерфейсом к другому коду, обеспечивая доступ к ресурсам, к которым нельзя обратиться иными способами. Здесь полная аналогия с классами .NET Framework, требующими определенных разрешений на доступ к используемым ими ресурсам. При предоставлении доступа к ресурсу код должен сначала запросить соответствующее разрешение на использование такого ресурса (т. е. пройти проверку защиты), а затем объявить свои права на выполнение самой операции.

Связанные разделы

Название

Описание

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

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

Запросы разрешений

Описание взаимодействия с системой безопасности .NET Framework с помощью запрашиваемых разрешений.

Обеспечение безопасности данных

Описание способов защиты закрытых членов.

Безопасность доступа к методам

Описание способов защиты методов от их вызова частично доверенным кодом.

Безопасность кода программы-оболочки

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

Безопасность и поля-массивы с общим доступом только для чтения

Описание проблем обеспечения безопасности, связанных с кодом, использующим массивы с общим доступом только для чтения, которые встречаются в библиотеках .NET Framework.

Безопасность обработки исключений

Описание обеспечения безопасности при обработке исключений.

Безопасность и ввод данных пользователем

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

Вопросы безопасности при удаленном взаимодействии

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

Безопасность и сериализация

Описание обеспечения безопасности при сериализации объектов.

Безопасность и конфликты

Описание способов, позволяющих избежать состояний гонки в коде.

Безопасность и создание кода "на лету"

Описание обеспечения безопасности приложений, создающих динамический код.

Опасные разрешения и администрирование политик

Описание разрешений, которые потенциально позволяют обойти систему безопасности.

Проблемы безопасности и установки

Описание вопросов, связанных с тестированием и установкой приложения.

Безопасность веб-приложений ASP.NET

Подробно описываются средства безопасности ASP.NET и приводятся инструкции по их использованию в коде.

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

Подробное описание управления доступом для кода в .NET Framework и инструкции по его использованию в коде.

Безопасность на основе ролей

Подробно описываются средства безопасности на основе ролей в .NET Framework и приводятся инструкции по их использованию в коде.