Demand et LinkDemand
Mise à jour : novembre 2007
La sécurité déclarative propose deux types de vérification de sécurité similaires, mais qui effectuent des vérifications très différentes. Vous devez connaître les deux formes car en cas de mauvais choix, vous risquez de connaître une baisse des performances et d'affaiblir la sécurité. Pour plus d'informations, consultez Demandes de sécurité.
La sécurité déclarative propose les vérifications de sécurité suivantes :
Demand spécifie le parcours de pile de la sécurité d'accès du code. Tous les appelants sur la pile doivent avoir l'autorisation ou l'identité spécifiée pour passer. Demand se produit sur chaque appel car la pile peut contenir des appelants différents. Si vous appelez une méthode de façon répétée, cette vérification de sécurité se produit à chaque fois. Demand constitue une bonne protection contre les attaques malveillantes ; le code non autorisé qui essaye de passer sera détecté.
LinkDemand se produit au moment de la compilation juste-à-temps (JIT, Just-In-Time) et vérifie uniquement l'appelant immédiat. Cette vérification de sécurité ne vérifie pas l'appelant de l'appelant. Une fois cette vérification effectuée, il n'y a pas de charge de sécurité supplémentaire, quel que soit le nombre d'appels effectués par l'appelant. Cependant, il n'y a pas non plus de protection contre les attaques malveillantes. Avec LinkDemand, tout code qui réussit le test et peut référencer votre code risque de perturber la sécurité en permettant à du code nuisible d'appeler à l'aide du code autorisé. Par conséquent, n'utilisez pas LinkDemand sauf s'il est possible d'éviter sans exception toutes les failles possibles.
Les précautions supplémentaires requises lors de l'utilisation de LinkDemand doivent être programmées individuellement ; le système de sécurité peut aider à leur application. La moindre erreur fait apparaître une défaillance en matière de sécurité. Tout le code autorisé qui utilise votre code doit prendre en charge l'implémentation de la sécurité supplémentaire en effectuant les opérations suivantes :
Limiter l'accès du code appelant à la classe ou à l'assembly ;
Placer les mêmes vérifications de sécurité sur le code appelant que celles figurant dans le code appelé et forcer ses appelants à effectuer les vérifications ; Par exemple, si vous écrivez du code qui appelle une méthode protégée par un LinkDemand pour SecurityPermission dont l'indicateur UnmanagedCode est spécifié, votre méthode doit également effectuer un LinkDemand (ou un Demand qui est plus fort) pour cette autorisation. L'exception : si votre code utilise la méthode protégée par LinkDemand d'une façon limitée que vous estimez être sécurisée étant donné les autres mécanismes de protection de la sécurité (comme les demandes) présents dans votre code. Dans ce cas exceptionnel, l'appelant prend la responsabilité d'affaiblir la protection de la sécurité sur le code sous-jacent.
Veiller à ce que les appelants de votre code ne puissent pas tromper celui-ci et lui faire appeler le code protégé de leur part. En d'autres termes, les appelants ne peuvent pas forcer le code autorisé à passer des paramètres spécifiques au code protégé ou pour obtenir de ce dernier des résultats.
Interfaces et demandes de liaison
Si une méthode, propriété ou événement virtuel avec LinkDemand substitue une méthode de la classe de base, cette méthode doit également avoir le même LinkDemand pour que la méthode substituée soit efficace. Il est possible pour le code nuisible de caster en type de base en retour et d'appeler la méthode de la classe de base. Notez également que les demandes de liaison peuvent être ajoutées implicitement aux assemblys qui n'ont pas l'attribut AllowPartiallyTrustedCallersAttribute de niveau assembly.
Il est recommandé de protéger les implémentations des méthodes avec des demandes de liaison lorsque des méthodes d'interface possèdent également des demandes de liaison. Notez les informations suivantes concernant l'utilisation de demandes de liaison avec des interfaces :
L'attribut AllowPartiallyTrustedCallersAttribute s'applique également aux interfaces.
Vous pouvez placer des demandes de liaison sur des interfaces pour protéger de manière sélective certaines interfaces de leur utilisation par du code d'un niveau de confiance partiel comme lors de l'utilisation de l'attribut AllowPartiallyTrustedCallersAttribute.
Si vous avez une interface définie dans un assembly qui ne contient pas l'attribut AllowPartiallyTrustedCallersAttribute, vous pouvez implémenter cette interface sur une classe d'un niveau de confiance partiel.
Si vous placez LinkDemand sur une méthode publique d'une classe qui implémente une méthode d'interface, LinkDemand ne sera pas appliqué si vous effectuez ensuite un cast en interface et appelez la méthode. Dans ce cas, comme vous avez relié à l'interface, seul LinkDemand sur l'interface est honoré.
Passez en revue les éléments suivants en examinant les questions de sécurité :
Explicitez les demandes de liaison sur des méthodes d'interface ; veillez à ce que ces demandes de liaison offrent la protection attendue ; déterminez si du code nuisible peut utiliser une conversion explicite pour contourner les demandes de liaison comme décrit précédemment ;
Méthodes virtuelles avec demandes de liaison appliquées ;
Types et interfaces qu'ils implémentent ; Ceux-ci doivent utiliser les demandes de liaison de manière cohérente.