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


Общие сведения о написании безопасного кода

Обновлен: Ноябрь 2007

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Другие ресурсы

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