2008-12-09 7 views
5

Quelqu'un peut-il expliquer la signification et les objectifs des valeurs de l'énumération SecurityAction?Présentation du paramètre "SecurityAction" de .NET pour les autorisations

La page MSDN n'est pas très claire. Il indique que LinkDemand se produit lors de la compilation juste-à-temps alors que la demande se produit au moment de l'exécution.

Pourquoi la distinction et dans quelles situations est-ce que j'utiliserais LinkDemand par opposition à Demand?

De même, quels sont les cas d'utilisation des autres valeurs intéressantes comme InheritenceDemand, Assert et PermitOnly. LinkDemand exige fondamentalement que le code appelant ait l'autorisation spécifiée.

Répondre

18

La demande, d'autre part, exige non seulement le code appelant pour avoir l'autorisation spécifiée, mais aussi le code qui a appelé le code appelant, et le code qui a appelé cela, et ainsi de suite, tout le long de la pile (ou jusqu'à Assert est trouvé, voir ci-dessous). LinkDemand peut être appliqué au moment de la compilation JIT, car si le compilateur JIT rencontre une instruction qui appelle une méthode avec un LinkDemand, il peut déterminer immédiatement si le code appelant a l'autorisation ou non. La demande doit être appliquée au moment de l'exécution chaque fois qu'un appel est fait à la méthode, car il n'est pas possible au moment de la compilation de savoir ce qui sera sur la pile pendant un appel donné. En tant que tel, LinkDemand est beaucoup plus efficace. Cependant, le compromis pour cette efficacité est moins de sécurité. Avec LinkDemand, vous avez confiance que le code appelant ne laissera pas le code d'appel ITS (qui peut ou non avoir la permission) l'utiliser à des fins infâmes. (En d'autres termes, vous faites confiance qu'il n'y a pas de failles de sécurité dans le code appelant que ses appelants peuvent exploiter pour accéder indirectement à la méthode avec LinkDemand.) Avec Demand, vous savez que tout le monde sur la pile a absolument moins jusqu'à ce qu'un Assert soit trouvé), il n'y a donc aucun risque de la part des appelants non fiables.

Assert est essentiellement un court-circuit pour la demande. Le contrôle de sécurité qui se produit avec Demand s'arrête si un appelant sur la pile a un Assert actif (en d'autres termes, seuls les appelants dans la pile jusqu'à l'Assert doivent avoir la permission). Donc, comme LinkDemand, vous devez avoir confiance que le code avec l'Assert ne peut pas être exploité par ses appelants. Deny est également un court-circuit pour la demande, mais au lieu d'affirmer une autorisation, elle annule une permission qu'un appelant pourrait avoir. Vous utiliserez ceci pour éviter les failles de sécurité possibles en vous assurant qu'aucune autorisation étrangère n'est en vigueur pendant un appel qui pourrait être exploitable. PermitOnly est comme Deny, sauf qu'au lieu de refuser une autorisation spécifique, il refuse toutes les permissions SAUF celle spécifiée. InheritanceDemand, contrairement aux autres, n'est pas directement lié aux appels de méthodes, mais indique qu'une classe qui n'a pas l'autorisation ne peut pas hériter de la classe avec InheritanceDemand. Cela pourrait être utilisé, par exemple, pour empêcher un code non sécurisé d'accéder aux membres protégés de la classe qui seraient autrement accessibles aux classes descendantes.

Questions connexes