Instructions de codage sécuriséSecure Coding Guidelines

La sécurité basée sur les preuves et la sécurité d’accès du code fournissent des mécanismes particulièrement puissants et explicites d’implémentation de la sécurité.Evidence-based security and code access security provide very powerful, explicit mechanisms to implement security. La plupart des codes d’application peuvent simplement utiliser l’infrastructure implémentée par le .NET Framework.Most application code can simply use the infrastructure implemented by the .NET Framework. Dans certains cas, une sécurité supplémentaire spécifique à l’application est nécessaire, générée via l’extension du système de sécurité ou via de nouvelles méthodes ad hoc.In some cases, additional application-specific security is required, built either by extending the security system or by using new ad hoc methods.

Vous devez utiliser les autorisations appliquées par le .NET Framework et d’autres vérifications dans le code pour dresser des barrières visant à empêcher un code malveillant d’obtenir des informations que vous ne voulez pas partager ou d’effectuer d’autres actions indésirables.Using the .NET Framework-enforced permissions and other enforcement in your code, you should erect barriers to prevent malicious code from obtaining information that you do not want it to have or performing other undesirable actions. En outre, il vous faut trouver un compromis entre la sécurité et les possibilités d’utilisation dans tous les scénarios prévus qui utilisent du code de confiance.Additionally, you must strike a balance between security and usability in all the expected scenarios using trusted code.

Cette présentation décrit les différents procédés permettant de concevoir du code qui fonctionne avec le système de sécurité.This overview describes the different ways code can be designed to work with the security system.

Sécurisation de l’accès aux ressourcesSecuring Resource Access

Lorsque vous concevez et écrivez votre code, vous devez protéger et limiter l’accès du code aux ressources, tout particulièrement quand vous utilisez ou appelez un code d’une origine inconnue.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. Par conséquent, ayez à l’esprit les techniques suivantes afin de garantir la sécurité de votre code :So, keep in mind the following techniques to ensure your code is secure:

  • N’utilisez pas la sécurité d’accès du code (CAS, Code Access Security).Do not use Code Access Security (CAS).

  • N’utilisez pas du code de confiance partielle.Do not use partial trusted code.

  • N’utilisez pas .NET Remoting.Do not use .NET Remoting.

  • N’utilisez pas le modèle COM distribué (Distributed Component Object Model, DCOM).Do not use Distributed Component Object Model (DCOM).

  • N’utilisez pas de formateurs binaires.Do not use binary formatters.

La sécurité d’accès au code et le code transparent de sécurité ne seront pas pris en charge en tant que frontière de sécurité avec du code d’un niveau de confiance partiel.Code Access Security and Security-Transparent Code will not be supported as a security boundary with partially trusted code. Nous vous déconseillons de charger et d'exécuter du code d'origine inconnue sans mettre en place d'autres mesures de sécurité.We advise against loading and executing code of unknown origins without putting alternative security measures in place. Les autres mesures de sécurité sont les suivantes :The alternative security measures are:

  • VirtualisationVirtualization

  • Conteneurs d’applicationsAppContainers

  • Utilisateurs et autorisations du système d’exploitationOperating system (OS) users and permissions

  • Conteneurs Hyper-VHyper-V containers

Code indépendant de la sécuritéSecurity-Neutral Code

Un code indépendant de la sécurité ne fait rien d’explicite avec le système de sécurité.Security-neutral code does nothing explicit with the security system. Il s’exécute quelles que soient les autorisations qu’il reçoit.It runs with whatever permissions it receives. Des applications qui ne parviennent pas à intercepter les exceptions de sécurité associées à des opérations protégées (comme l’utilisation de fichiers, la mise en réseau, etc.) peuvent engendrer une exception non gérée, mais le code indépendant de la sécurité tire néanmoins parti des technologies de sécurité du .NET Framework.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 .NET Framework security technologies.

Une bibliothèque indépendante de la sécurité possède des caractéristiques particulières que vous devez connaître.A security-neutral library has special characteristics that you should understand. Supposons que votre bibliothèque fournisse des éléments d’API qui utilisent des fichiers ou appellent du code non managé. Si votre code ne possède pas l’autorisation correspondante, il ne s’exécutera pas comme décrit.Suppose your library provides API elements that use files or call unmanaged code; if your code does not have the corresponding permission, it will not run as described. Toutefois, même si le code possède cette autorisation, n’importe quel autre code d’application qui l’appelle doit avoir la même autorisation pour pouvoir fonctionner.However, even if the code has the permission, any application code that calls it must have the same permission in order to work. Si le code appelant n’a pas l’autorisation appropriée, une SecurityException s’affiche à la suite le parcours de pile de code access security.If the calling code does not have the right permission, a SecurityException appears as a result of the code access security stack walk.

Code d’application ne correspondant pas à un composant réutilisableApplication Code That Is Not a Reusable Component

Si votre code fait partie d’une application qui ne sera pas appelée par un autre code, la sécurité est simple et un codage spécial peut ne pas être requis.If your code is part of an application that will not be called by other code, security is simple and special coding might not be required. Toutefois, n’oubliez pas qu’un code malveillant peut appeler votre code.However, remember that malicious code can call your code. Si la sécurité d’accès du code peut empêcher le code malveillant d’accéder à des ressources, ce type de code est toutefois capable de lire les valeurs de vos champs ou propriétés susceptibles de contenir des informations confidentielles.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.

De plus, si votre code accepte des entrées utilisateur à partir d’Internet ou d’autres sources peu fiables, vous devez vous méfier des entrées malveillantes.Additionally, if your code accepts user input from the Internet or other unreliable sources, you must be careful about malicious input.

Implémentation d’un wrapper managé vers du code natifManaged Wrapper to Native Code Implementation

Dans ce scénario, certaines fonctionnalités utiles sont implémentées dans du code natif que vous souhaitez mettre à la disposition du code managé.Typically in this scenario, some useful functionality is implemented in native code that you want to make available to managed code. Il est aisé d’écrire des wrappers managés en utilisant l’appel de code non managé ou COM Interop.Managed wrappers are easy to write using either platform invoke or COM interop. Toutefois, si vous procédez ainsi, les appelants de vos wrappers doivent avoir des droits de code non managé pour réussir.However, if you do this, callers of your wrappers must have unmanaged code rights in order to succeed. Dans le cadre de la stratégie par défaut, cela signifie que le code téléchargé depuis un intranet ou Internet ne fonctionne pas avec les wrappers.Under default policy, this means that code downloaded from an intranet or the Internet will not work with the wrappers.

Au lieu d’accorder des droits de code non managé à toutes les applications qui utilisent ces wrappers, il est préférable d’accorder ces droits uniquement au code wrapper.Instead of giving all applications that use these wrappers unmanaged code rights, it is better to give these rights only to the wrapper code. Si les fonctionnalités sous-jacentes n’exposent aucune ressource et que l’implémentation est également sécurisée, le wrapper doit simplement déclarer ses droits, ce qui permet à n’importe quel code d’effectuer un appel via celui-ci.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. Lorsque des ressources sont impliquées, le codage de sécurité doit être identique à l’exemple de code de bibliothèque décrit dans la section suivante.When resources are involved, security coding should be the same as the library code case described in the next section. Comme le wrapper expose potentiellement les appelants à ces ressources, une vérification minutieuse de la sécurité du code natif est nécessaire. Celle-ci relève de la responsabilité du wrapper.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.

Code de bibliothèque exposant des ressources protégéesLibrary Code That Exposes Protected Resources

Il s’agit de l’approche la plus puissante et donc la plus risquée (si elle n’est pas exécutée correctement) du codage de sécurité : votre bibliothèque sert d’interface permettant à un autre code d’accéder à certaines ressources qui ne sont pas disponibles autrement, tout comme les classes du .NET Framework appliquent des autorisations pour les ressources qu’elles utilisent.This is the most powerful and hence potentially dangerous (if done incorrectly) approach for security coding: Your library serves as an interface for other code to access certain resources that are not otherwise available, just as the classes of the .NET Framework enforce permissions for the resources they use. Chaque fois que vous exposez une ressource, votre code doit en premier lieu demander l’autorisation appropriée à la ressource (autrement dit, il doit effectuer une vérification de sécurité), puis généralement déclarer ses droits pour effectuer l’opération proprement dite.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.

TitreTitle DescriptionDescription
Sécurisation des données d’étatSecuring State Data Décrit comment protéger les membres privés.Describes how to protect private members.
Sécurité et entrées d’utilisateurSecurity and User Input Décrit les problèmes de sécurité liés à des applications qui acceptent les entrées utilisateur.Describes security concerns for applications that accept user input.
Sécurité et conditions de concurrenceSecurity and Race Conditions Décrit comment éviter des conditions de concurrence critique dans votre code.Describes how to avoid race conditions in your code.
Sécurité et génération de code immédiateSecurity and On-the-Fly Code Generation Décrit les problèmes de sécurité liés à des applications qui génèrent du code dynamique.Describes security concerns for applications that generate dynamic code.
Sécurité basée sur les rôlesRole-Based Security Fournit une description détaillée de la sécurité basée sur les rôles de .NET Framework et explique comment l’utiliser dans votre code.Describes .NET Framework role-based security in detail and provides instructions for using it in your code.