Considérations sur la sécurité et la communication à distanceSecurity and Remoting Considerations

La communication à distance vous permet de définir des appels transparents entre des domaines d'application, des processus ou des ordinateurs.Remoting allows you to set up transparent calling between application domains, processes, or computers. Cependant, le parcours de pile de la sécurité d'accès du code ne peut pas traverser des processus ou des limites de machine (il s'applique pourtant entre les domaines d'application du même processus).However, the code access security stack walk cannot cross process or machine boundaries (it does apply between application domains of the same process).

Toute classe accessible à distance (dérivée d'une classe MarshalByRefObject) doit être responsable de la sécurité.Any class that is remotable (derived from a MarshalByRefObject class) needs to take responsibility for security. Soit le code ne doit être utilisé que dans des environnements fermés où le code appelant peut faire l'objet d'une confiance implicite, soit des appels de communication à distance doivent être conçus de façon à ne pas soumettre de code protégé à une entrée externe qui pourrait être utilisée à des fins malveillantes.Either the code should be used only in closed environments where the calling code can be implicitly trusted, or remoting calls should be designed so that they do not subject protected code to outside entry that could be used maliciously.

En règle générale, vous ne devez jamais exposer méthodes, propriétés ou événements qui sont protégées par déclarative LinkDemand et InheritanceDemand des vérifications de sécurité.Generally, you should never expose methods, properties, or events that are protected by declarative LinkDemand and InheritanceDemand security checks. Avec la communication à distance, ces contrôles ne sont pas appliqués.With remoting, these checks are not enforced. Autres vérifications de sécurité, telles que Demand, Assert, etc., fonctionnent entre domaines d’application dans un processus, mais pas dans les scénarios entre processus ou entre ordinateurs.Other security checks, such as Demand, Assert, and so on, work between application domains within a process but do not work in cross-process or cross-machine scenarios.

Objets protégésProtected objects

Certains objets comportent un état de sécurité.Some objects hold security state in themselves. Ces objets ne doivent pas être passés à du code non fiable, qui obtiendrait alors des autorisations de sécurité n'entrant pas dans le champ de ses propres autorisations.These objects should not be passed to untrusted code, which would then acquire security authorization beyond its own permissions.

Un exemple consiste à créer un objet FileStream.One example is creating a FileStream object. Le FileIOPermission est exigé au moment de la création et, en cas de réussite, l'objet de fichier est retourné.The FileIOPermission is demanded at the time of creation and, if it succeeds, the file object is returned. Toutefois, si cette référence d'objet est passée au code sans les autorisations de fichier, l'objet pourra lire et écrire dans ce fichier.However, if this object reference is passed to code without file permissions, the object will be able to read and write to this particular file.

La défense la plus simple pour ce type d’objet est d’exiger le même FileIOPermission de n’importe quel code qui cherche à obtenir la référence d’objet à un élément d’API publique.The simplest defense for such an object is to demand the same FileIOPermission of any code that seeks to get the object reference through a public API element.

Questions relatives au franchissement de domaine d'applicationApplication domain crossing issues

Pour isoler du code dans des environnements d'hébergement managés, il est courant de générer plusieurs domaines d'application enfants dont la stratégie explicite réduit les niveaux d'autorisations pour divers assemblys.To isolate code in managed hosting environments, it is common to generate multiple child application domains with explicit policy reducing the permission levels for various assemblies. Cependant, la stratégie pour ces assemblys reste inchangée dans le domaine d'application par défaut.However, the policy for those assemblies remains unchanged in the default application domain. Si l'un des domaines d'application enfants peut forcer le domaine d'application par défaut à charger un assembly, l'effet de l'isolement du code est perdu et les types dans l'assembly chargé de force pourront exécuter du code à un niveau de confiance plus élevé.If one of the child application domains can force the default application domain to load an assembly, the effect of code isolation is lost and types in the forcibly loaded assembly will be able to run code at a higher level of trust.

Un domaine d'application peut forcer un autre domaine d'application à charger un assembly et exécuter le code qu'il contient en appelant un proxy vers un objet hébergé dans l'autre domaine d'application.An application domain can force another application domain to load an assembly and run code contained therein by calling a proxy to an object hosted in the other application domain. Pour obtenir un proxy entre domaines d'application, le domaine d'application qui héberge l'objet doit en distribuer un par l'intermédiaire d'un paramètre d'appel de méthode ou d'une valeur de retour.To obtain a cross-application-domain proxy, the application domain hosting the object must distribute one through a method call parameter or return value. Ou, si le domaine d'application vient d'être créé, le créateur possède un proxy vers l'objet Ou, si le domaine d'application vient d'être créé, le créateur possède un proxy vers l'objet AppDomain par défaut.Or, if the application domain was just created, the creator has a proxy to the AppDomain object by default. Ainsi, pour éviter d'interrompre l'isolement du code, un domaine d'application dont le niveau de confiance est supérieur ne doit pas distribuer de références aux objets marshalés par référence (instances de classes dérivées de MarshalByRefObject) dans son domaine à des domaines d'application dont les niveaux de confiance sont moindres.Thus, to avoid breaking code isolation, an application domain with a higher level of trust should not distribute references to marshaled-by-reference objects (instances of classes derived from MarshalByRefObject) in its domain to application domains with lower levels of trust.

Généralement, le domaine d'application par défaut crée les domaines d'application enfants avec un objet contrôle dans chacun d'entre eux.Usually, the default application domain creates the child application domains with a control object in each one. L'objet contrôle gère le nouveau domaine d'application et de manière occasionnelle reçoit des instructions du domaine d'application par défaut, mais il ne peut pas en fait contacter le domaine directement.The control object manages the new application domain and occasionally takes orders from the default application domain, but it cannot actually contact the domain directly. Parfois, le domaine d'application par défaut appelle son proxy vers l'objet contrôle.Occasionally, the default application domain calls its proxy to the control object. Cependant, il se peut qu'il y ait des cas où il est nécessaire que l'objet contrôle rappelle dans le domaine d'application par défaut.However, there might be cases in which it is necessary for the control object to call back to the default application domain. Dans ces cas, le domaine d'application par défaut passe un objet de rappel marshalé par référence au constructeur de l'objet contrôle.In these cases, the default application domain passes a marshal-by-reference callback object to the constructor of the control object. L'objet contrôle est responsable de la protection de ce proxy.It is the responsibility of the control object to protect this proxy. Si l'objet contrôle devait placer le proxy sur un champ statique public d'une classe public ou exposer publiquement le proxy d'une autre manière, cela ouvrirait un mécanisme dangereux permettant à un autre code de rappeler dans le domaine d'application par défaut.If the control object were to place the proxy on a public static field of a public class, or otherwise publicly expose the proxy, this would open up a dangerous mechanism for other code to call back into the default application domain. C'est la raison pour laquelle les objets contrôle sont toujours autorisés de manière implicite à maintenir le proxy privé.For this reason, control objects are always implicitly trusted to keep the proxy private.

Voir aussiSee Also

Instructions de codage sécuriséSecure Coding Guidelines