Рекомендации по безопасному написанию кодаSecure coding guidelines

Защита на основе фактических данных и управление доступом для кода предоставляют очень мощные, четкие механизмы для обеспечения безопасности.Evidence-based security and code access security provide very powerful, explicit mechanisms to implement security. Большая часть кода приложения может просто использовать инфраструктуру, реализованную в .NET.Most application code can simply use the infrastructure implemented by .NET. В некоторых случаях требуется дополнительная защита на уровне приложения, построенная либо путем расширения системы, либо с помощью новых специальных методов.In some cases, additional application-specific security is required, built either by extending the security system or by using new ad hoc methods.

Используя принудительные разрешения .NET и другие средства обеспечения безопасности в коде, следует возводить барьеры, чтобы предотвратить доступ вредоносного кода к информации, которую не нужно использовать, или выполнить другие нежелательные действия.Using .NET enforced permissions and other enforcement in your code, you should erect barriers to prevent malicious code from accessing information that you don't want it to have or performing other undesirable actions. Кроме того, необходимо соблюсти баланс между безопасностью и удобством использования во всех планируемых сценариях с использованием доверенного кода.Additionally, you must strike a balance between security and usability in all the expected scenarios using trusted code.

В этом обзоре описываются различные способы разработки кода, взаимодействующего с системой безопасности.This overview describes the different ways code can be designed to work with the security system.

Защита доступа к ресурсамSecuring resource access

При разработке и написания кода необходимо защитить и ограничить доступ данного кода к ресурсам, особенно при использовании или вызове кода неизвестного происхождения.When designing and writing your code, you need to protect and limit the access that code has to resources, especially when using or invoking code of unknown origin. Убедиться, что ваш код является безопасным, можно с помощью следующих методов.So, keep in mind the following techniques to ensure your code is secure:

  • Не используйте управление доступом для кода (CAS).Do not use Code Access Security (CAS).

  • Не используйте частично доверенный код.Do not use partial trusted code.

  • Не используйте атрибут алловпартиаллитрустедкаллер (APTCA).Do not use the AllowPartiallyTrustedCaller attribute (APTCA).

  • Не используйте удаленное взаимодействие .NET.Do not use .NET Remoting.

  • Не используйте модель DCOM.Do not use Distributed Component Object Model (DCOM).

  • Не используйте двоичные модули форматирования.Do not use binary formatters.

Безопасность доступа к коду и прозрачный для системы безопасности код не поддерживаются в качестве границы безопасности с частично доверенным кодом.Code Access Security and Security-Transparent Code are not supported as a security boundary with partially trusted code. Мы не рекомендуем загружать и выполнять код из неизвестных источников, не предприняв дополнительные меры безопасности.We advise against loading and executing code of unknown origins without putting alternative security measures in place. Ниже приведены дополнительные меры безопасности.The alternative security measures are:

  • ВиртуализацияVirtualization

  • Контейнеры AppContainerAppContainers

  • Пользователи операционной системы (ОС) и разрешенияOperating system (OS) users and permissions

  • Контейнеры Hyper-VHyper-V containers

Код, нейтральный к безопасностиSecurity-neutral code

Нейтральный код не взаимодействует явным образом с системой безопасности.Security-neutral code does nothing explicit with the security system. Он работает с любыми полученными разрешениями.It runs with whatever permissions it receives. Хотя приложения, которые не перехватывают исключения безопасности, связанные с защищенными операциями (например, использование файлов, сети и т. д.), могут привести к необработанному исключению, код, нейтральный к безопасности, по-прежнему использует преимущества технологий безопасности в .NET. .Although applications that fail to catch security exceptions associated with protected operations (such as using files, networking, and so on) can result in an unhandled exception, security-neutral code still takes advantage of the security technologies in .NET.

Библиотека нейтрального кода имеет особенности, которые следует понимать.A security-neutral library has special characteristics that you should understand. Предположим, что библиотека предоставляет элементы API, которые используют файлы или вызывают неуправляемый код.Suppose your library provides API elements that use files or call unmanaged code. Если код не имеет соответствующего разрешения, он не будет выполняться, как описано.If your code doesn't have the corresponding permission, it won't run as described. Однако даже если код имеет разрешения, вызывающий его код приложения должен иметь те же разрешения, чтобы он мог работать.However, even if the code has the permission, any application code that calls it must have the same permission in order to work. Если вызывающий код не имеет нужных разрешений, SecurityException появляется в результате анализа стека управления доступом для кода.If the calling code doesn't have the right permission, a SecurityException appears as a result of the code access security stack walk.

Код приложения, который не является повторно используемым компонентомApplication code that isn't a reusable component

Если код является частью приложения, которое не будет вызываться другим кодом, обеспечение безопасности является простым, а специальное кодирование может не требоваться.If your code is part of an application that won't be called by other code, security is simple and special coding might not be required. Однако помните, что вредоносный код может вызвать ваш код.However, remember that malicious code can call your code. Хотя управление доступом для кода может предотвратить доступ вредоносного кода к ресурсам, такой код все еще может считывать значения полей или свойств, которые могут содержать конфиденциальные сведения.While code access security might stop malicious code from accessing resources, such code could still read values of your fields or properties that might contain sensitive information.

Кроме того, если код принимает ввод пользователя из Интернета или других ненадежных источников, будьте осторожны, чтобы не были введены вредоносные данные.Additionally, if your code accepts user input from the Internet or other unreliable sources, you must be careful about malicious input.

Реализация управляемой оболочки в машинный кодManaged wrapper to native code implementation

Обычно в этом сценарии некоторые полезные функции реализуются в машинном коде, который требуется сделать доступным для управляемого кода.Typically in this scenario, some useful functionality is implemented in native code that you want to make available to managed code. Управляемые оболочки легко создаются с помощью вызова неуправляемого кода или COM-взаимодействия.Managed wrappers are easy to write using either platform invoke or COM interop. Однако если это сделать, для успешного выполнения вызывающим ваши оболочки объектам необходимо предоставить права на неуправляемый код.However, if you do this, callers of your wrappers must have unmanaged code rights in order to succeed. В разделе Политика по умолчанию это означает, что код, скачанный из интрасети или Интернета, не будет работать с оболочками.Under default policy, this means that code downloaded from an intranet or the Internet won't work with the wrappers.

Вместо предоставления прав на неуправляемый код для всех приложений, использующих эти оболочки, лучше предоставить эти права только коду оболочки.Instead of giving unmanaged code rights to all applications that use these wrappers, it's better to give these rights only to the wrapper code. Если эта базовая функциональность не предоставляет никакие ресурсы и реализация также безопасна, оболочке достаточно просто объявить свои права, что позволяет любому коду вызывать ее.If the underlying functionality exposes no resources and the implementation is likewise safe, the wrapper only needs to assert its rights, which enables any code to call through it. При использовании ресурсов написание безопасного кода должно быть таким же, как в случае кода библиотеки, описанного в следующем разделе.When resources are involved, security coding should be the same as the library code case described in the next section. Поскольку оболочка потенциально предоставляет вызывающим объектам доступ к этим ресурсам, необходима тщательная проверка безопасности машинного кода, за которую отвечает оболочка.Because the wrapper is potentially exposing callers to these resources, careful verification of the safety of the native code is necessary and is the wrapper's responsibility.

Код библиотеки, предоставляющий защищенные ресурсыLibrary code that exposes protected resources

Следующий подход является наиболее мощным и, следовательно, потенциально опасным (при неправильном завершении) для написания кода безопасности. Библиотека выступает в качестве интерфейса для другого кода, чтобы получить доступ к определенным ресурсам, которые не доступны иным образом, точно так же, как классы .NET применяются разрешения для используемых ресурсов.The following approach is the most powerful and hence potentially dangerous (if done incorrectly) for security coding: your library serves as an interface for other code to access certain resources that aren't otherwise available, just as the .NET classes enforce permissions for the resources they use. При предоставлении доступа к ресурсу код должен сначала запросить соответствующее разрешение на ресурс (т. е. он должен выполнить проверку безопасности), а затем объявить свои права на выполнение текущей операции.Wherever you expose a resource, your code must first demand the permission appropriate to the resource (that is, it must perform a security check) and then typically assert its rights to perform the actual operation.

ЗаголовокTitle ОписаниеDescription
Обеспечение безопасности данныхSecuring State Data Описание порядка защиты закрытых членов.Describes how to protect private members.
Безопасность и ввод данных пользователемSecurity and User Input Вопросы безопасности для приложений, которые принимают пользовательский ввод.Describes security concerns for applications that accept user input.
Безопасность и конфликтыSecurity and Race Conditions Описывается, как избежать состояний соперничества в коде.Describes how to avoid race conditions in your code.
Безопасность и создание кода "на лету"Security and On-the-Fly Code Generation Вопросы безопасности для приложений, создающих динамический код.Describes security concerns for applications that generate dynamic code.
Безопасность на основе ролейRole-Based Security Подробное описание безопасности на основе ролей в .NET и инструкции по его использованию в коде.Describes .NET role-based security in detail and provides instructions for using it in your code.