Sicherheitsüberlegungen für die ReflektionSecurity Considerations for Reflection

Die Reflektion bietet die Möglichkeit, Typ- und Memberinformationen abzurufen und auf Member zuzugreifen (d. h. Aufrufen von Methoden und Konstruktoren, Abrufen und Festlegen von Eigenschaftswerten, Hinzufügen und Entfernen von Ereignishandlern usw.).Reflection provides the ability to obtain information about types and members, and to access members (that is, to call methods and constructors, to get and set property values, to add and remove event handlers, and so on). Die Verwendung von Reflektion, um Typ- und Memberinformationen abzurufen, ist nicht eingeschränkt.The use of reflection to obtain information about types and members is not restricted. Jeglicher Code kann Reflektion verwenden, um die folgenden Aufgaben auszuführen:All code can use reflection to perform the following tasks:

  • Auflisten von Typen und Membern und Prüfen von deren Metadaten.Enumerate types and members, and examine their metadata.

  • Auflisten und Prüfen von Assemblys und Modulen.Enumerate and examine assemblies and modules.

Das Verwenden von Reflektion, um auf Member zuzugreifen, ist dagegen Einschränkungen unterworfen.Using reflection to access members, by contrast, is subject to restrictions. Ab .NET Framework 4 kann nur vertrauenswürdiger Code Reflektion für den Zugriff auf sicherheitskritische Member verwenden.Beginning with the .NET Framework 4, only trusted code can use reflection to access security-critical members. Darüber hinaus kann nur vertrauenswürdiger Code Reflektion verwenden, um auf nicht öffentliche Member zuzugreifen, die in kompiliertem Code nicht direkt zugänglich sind.Furthermore, only trusted code can use reflection to access nonpublic members that would not be directly accessible to compiled code. Schließlich muss Code, der über Reflektion auf einen sicherheitskritischen Member zugreift, jegliche Berechtigungen haben, die der sicherheitskritische Member erfordert, genauso wie bei kompiliertem Code.Finally, code that uses reflection to access a safe-critical member must have whatever permissions the safe-critical member demands, just as with compiled code.

Sofern die notwendigen Berechtigungen vorliegen, kann Code mithilfe von Reflektion die folgenden Zugriffsarten ausführen:Subject to necessary permissions, code can use reflection to perform the following kinds of access:

  • Zugreifen auf öffentliche Member, die nicht sicherheitskritisch sind.Access public members that are not security-critical.

  • Zugreifen auf nicht öffentliche Member, auf die kompilierter Code zugreifen könnte, wenn diese Member nicht sicherheitskritisch sind.Access nonpublic members that would be accessible to compiled code, if those members are not security-critical. Beispiele für solche nicht öffentlichen Member:Examples of such nonpublic members include:

    • Geschützte Member der Basisklassen des aufrufenden Codes.Protected members of the calling code's base classes. (In Reflektion wird dies als Zugriff auf Familienebene bezeichnet.)(In reflection, this is referred to as family-level access.)

    • internal-Member (Friend-Member in Visual Basic) in der Assembly des aufrufenden Codes.internal members (Friend members in Visual Basic) in the calling code's assembly. (In Reflektion wird dies als Zugriff auf Assemblyebene bezeichnet.)(In reflection, this is referred to as assembly-level access.)

    • Private Member von anderen Instanzen der Klasse, die den aufrufenden Code enthält.Private members of other instances of the class that contains the calling code.

Zum Beispiel ist Code, der in einer Sandkastenanwendungsdomäne ausgeführt wird, auf den in dieser Liste beschriebenen Zugriff beschränkt, es sei denn, die Anwendungsdomäne gewährt zusätzliche Berechtigungen.For example, code that is run in a sandboxed application domain is limited to the access described in this list, unless the application domain grants additional permissions.

Ab .NET Framework 2.0 Service Pack 1 wird bei einem Zugriffsversuch auf Member, auf die normalerweise nicht zugegriffen werden kann, eine Anforderung nach dem Berechtigungssatz des Zielobjekts plus ReflectionPermission mit dem ReflectionPermissionFlag.MemberAccess-Flag erstellt.Starting with the .NET Framework 2.0 Service Pack 1, attempting to access members that are normally inaccessible generates a demand for the grant set of the target object plus ReflectionPermission with the ReflectionPermissionFlag.MemberAccess flag. Code, der mit voller Vertrauenswürdigkeit ausgeführt wird (z.B. Code in einer Anwendung, die über die Befehlszeile gestartet wird), kann diese Berechtigungen immer erfüllen.Code that is running with full trust (for example, code in an application that is launched from the command line) can always satisfy these permissions. (Dies unterliegt Einschränkungen beim Zugriff auf sicherheitskritische Member, wie dies in diesem Artikel weiter unten beschrieben ist.)(This is subject to limitations in accessing security-critical members, as described later in this article.)

Optional kann eine Sandkastenanwendungsdomäne ReflectionPermission mit dem ReflectionPermissionFlag.MemberAccess-Flag gewähren, wie dies weiter unten in diesem Artikel im Abschnitt Zugreifen auf Member, auf die normalerweise nicht zugegriffen werden kann beschrieben ist.Optionally, a sandboxed application domain can grant ReflectionPermission with the ReflectionPermissionFlag.MemberAccess flag, as described in the section Accessing Members That Are Normally Inaccessible, later in this article.

Zugreifen auf sicherheitskritische MemberAccessing Security-Critical Members

Ein Member ist sicherheitskritisch, wenn er das SecurityCriticalAttribute, wenn er zu einem Typ gehört, der das SecurityCriticalAttribute hat, oder wenn er sich in einer sicherheitskritischen Assembly befindet.A member is security-critical if it has the SecurityCriticalAttribute, if it belongs to a type that has the SecurityCriticalAttribute, or if it is in a security-critical assembly. Ab .NET Framework 4 gelten folgende Regeln für den Zugriff auf sicherheitskritische Member:Beginning with the .NET Framework 4, the rules for accessing security-critical members are as follows:

Diese Regeln gelten immer, ganz gleich, ob auf einen sicherheitskritischen Member direkt aus kompiliertem Code oder über Reflektion zugegriffen wird.These rules are the same whether a security-critical member is accessed directly by compiled code, or accessed by using reflection.

Anwendungscode, der über die Befehlszeile ausgeführt wird, wird mit voller Vertrauenswürdigkeit ausgeführt.Application code that is run from the command line runs with full trust. Solange Code nicht als transparent gekennzeichnet ist, kann er über Reflektion auf sicherheitskritische Member zugreifen.As long as it is not marked as transparent, it can use reflection to access security-critical members. Wenn der gleiche Code mit teilweiser Vertrauenswürdigkeit ausgeführt wird (z. B. in einer Sandkastenanwendungsdomäne), bestimmt die Vertrauensebene der Assembly, ob der Zugriff auf sicherheitskritischen Code gewährt wird: Wenn die Assembly über einen starken Namen verfügt und im globalen Assemblycache installiert ist, ist sie eine vertrauenswürdige Assembly und sie kann sicherheitskritische Member aufrufen.When the same code is run with partial trust (for example, in a sandboxed application domain) the assembly's trust level determines whether it can access security-critical code: If the assembly has a strong name and is installed in the global assembly cache, it is a trusted assembly and can call security-critical members. Ist die Assembly nicht vertrauenswürdig ist, wird sie transparent, obwohl sie nicht als transparent gekennzeichnet wurde, und sie kann nicht auf sicherheitskritische Member zugreifen.If it is not trusted, it becomes transparent even though it was not marked as transparent, and it cannot access security-critical members.

Weitere Informationen zum Sicherheitsmodell in .NET Framework 4 finden Sie unter Änderungen der Sicherheit in .NET Framework.For more information about the security model in the .NET Framework 4, see Security Changes.

Reflektion und TransparenzReflection and Transparency

Ab .NET Framework 4 bestimmt die Common Language Runtime (CLR) die Transparenzebene eines Typs oder Members auf der Grundlage mehrerer Faktoren (einschließlich der Vertrauensebene der Assembly und der Vertrauensebene der Anwendungsdomäne).Beginning with the .NET Framework 4, the common language runtime determines the transparency level of a type or member from several factors, including the trust level of the assembly and the trust level of the application domain. Reflektion stellt die Eigenschaften IsSecurityCritical, IsSecuritySafeCritical und IsSecurityTransparent bereit, damit Sie die Transparenzebene eines Typs ermitteln können.Reflection provides the IsSecurityCritical, IsSecuritySafeCritical, and IsSecurityTransparent properties to enable you to discover the transparency level of a type. Die folgende Tabelle enthält die gültigen Kombinationen dieser Eigenschaften.The following table shows the valid combinations of these properties.

SicherheitsstufeSecurity level IsSecurityCriticalIsSecurityCritical IsSecuritySafeCriticalIsSecuritySafeCritical IsSecurityTransparentIsSecurityTransparent
KritischCritical true false false
SicherheitskritischSafe-critical true true false
TransparentTransparent false false true

Ein Verwenden dieser Eigenschaften ist deutlich einfacher als das Untersuchen der Sicherheitsanmerkungen einer Assembly und der zugehörigen Typen, das Überprüfen der aktuellen Vertrauensebene und das Versuchen, die Laufzeitregeln zu duplizieren.Using these properties is much simpler than examining the security annotations of an assembly and its types, checking the current trust level, and attempting to duplicate the runtime's rules. Derselbe Typ kann z. B. sicherheitskritisch sein, wenn er über die Befehlszeile ausgeführt wird, oder sicherheitstransparent, wenn er in einer Sandkastenanwendungsdomäne ausgeführt wird.For example, the same type can be security-critical when it is run from the command line, or security-transparent when it is run in a sandboxed application domain.

Die Klassen MethodBase, FieldInfo, TypeBuilder, MethodBuilder und DynamicMethod haben ähnliche Eigenschaften.There are similar properties on the MethodBase, FieldInfo, TypeBuilder, MethodBuilder, and DynamicMethod classes. (Bei anderen Reflektionen und Abstraktionen für die Reflektionsausgabe werden Sicherheitsattribute auf die zugeordneten Methoden angewendet; bei Eigenschaften werden sie z. B. auf die Eigenschaftenaccessoren angewendet.)(For other reflection and reflection emit abstractions, security attributes are applied to the associated methods; for example, in the case of properties they are applied to the property accessors.)

Zugreifen auf Member, auf die normalerweise nicht zugegriffen werden kannAccessing Members That Are Normally Inaccessible

Um über Reflektion Methoden aufzurufen, auf die nach den Zugriffsregeln der Common Language Runtime nicht zugegriffen kann, muss Ihrem Code eine von zwei Berechtigungen gewährt werden:To use reflection to invoke members that are inaccessible according to the accessibility rules of the common language runtime, your code must be granted one of two permissions:

  • Damit Code einen beliebigen nicht öffentlichen Member aufrufen kann, muss dem Code ReflectionPermission mit dem ReflectionPermissionFlag.MemberAccess-Flag gewährt werden.To allow code to invoke any nonpublic member:Your code must be granted ReflectionPermission with the ReflectionPermissionFlag.MemberAccess flag.

    Hinweis

    Standardmäßig verweigert die Sicherheitsrichtlinie diese Berechtigung für Code, der aus dem Internet stammt.By default, security policy denies this permission to code that originates from the Internet. Diese Berechtigung sollte niemals für Code gewährt werden, der aus dem Internet stammt.This permission should never be granted to code that originates from the Internet.

  • Damit Code beliebige nicht öffentliche Member aufrufen kann, sofern der Berechtigungssatz der Assembly, die den aufgerufenen Member enthält, mit dem Berechtigungssatz des aufrufenden Codes identisch oder eine Teilmenge dieses Berechtigungssatzes ist: Dem Code muss ReflectionPermission mit dem ReflectionPermissionFlag.RestrictedMemberAccess-Flag gewährt werden.To allow code to invoke any nonpublic member, as long as the grant set of the assembly that contains the invoked member is the same as, or a subset of, the grant set of the assembly that contains the invoking code: Your code must be granted ReflectionPermission with the ReflectionPermissionFlag.RestrictedMemberAccess flag.

Beispiel: Angenommen, Sie gewähren einer Anwendungsdomäne Internetberechtigungen plus ReflectionPermission mit dem ReflectionPermissionFlag.RestrictedMemberAccess-Flag und führen anschließend eine Internetanwendung mit den beiden Assemblys A und B aus.For example, suppose you grant an application domain Internet permissions plus ReflectionPermission with the ReflectionPermissionFlag.RestrictedMemberAccess flag, and then run an Internet application with two assemblies, A and B.

  • Assembly A kann Reflektion verwenden, um auf private Member von Assembly B zuzugreifen, da der Berechtigungssatz der Assembly B keine Berechtigungen enthält, die A nicht gewährt wurden.Assembly A can use reflection to access private members of assembly B, because the grant set of assembly B does not include any permissions that A has not been granted.

  • Assembly A kann Reflektion nicht verwenden, um auf private Member von .NET Framework-Assemblys wie „mscorlib.dll“ zuzugreifen, denn „mscorlib.dll“ ist voll vertrauenswürdig und hat daher Berechtigungen, die Assembly A nicht gewährt wurden. Eine MemberAccessException wird ausgelöst, wenn die Codezugriffssicherheit die Stapel zur Laufzeit durchläuft.Assembly A cannot use reflection to access private members of .NET Framework assemblies such as mscorlib.dll, because mscorlib.dll is fully trusted and therefore has permissions that have not been granted to assembly A. A MemberAccessException is thrown when code access security walks the stack at run time.

SerialisierungSerialization

Für Serialisierung bietet SecurityPermission mit dem SecurityPermissionAttribute.SerializationFormatter-Flag die Möglichkeit, Member von serialisierbaren Typen unabhängig davon, ob grundsätzlich auf sie zugegriffen werden kann, abzurufen und festzulegen.For serialization, SecurityPermission with the SecurityPermissionAttribute.SerializationFormatter flag provides the ability to get and set members of serializable types, regardless of accessibility. Mit dieser Berechtigung kann Code den privaten Status einer Instanz erkennen und ändern.This permission enables code to discover and change the private state of an instance. (Zusätzlich dazu, dass dem Typ die entsprechenden Berechtigungen gewährt werden, muss er in den Metadaten als serialisierbar markiert sein.)(In addition to being granted the appropriate permissions, the type must be marked as serializable in metadata.)

Parameter des MethodInfo-TypsParameters of Type MethodInfo

Sie sollten keine öffentlichen Member schreiben, an die MethodInfo-Parameter übergeben werden. Dies gilt insbesondere für vertrauenswürdigen Code.Avoid writing public members that take MethodInfo parameters, especially for trusted code. Solche Member sind möglicherweise anfälliger für Schadsoftware.Such members might be more vulnerable to malicious code. Nehmen Sie z. B. an, es gibt einen öffentlichen Member in hoch vertrauenswürdigem Code, und diesem Member wird ein MethodInfo-Parameter übergeben.For example, consider a public member in highly trusted code that takes a MethodInfo parameter. Nehmen Sie weiter an, der öffentliche Member ruft indirekt die Invoke-Methode für den bereitgestellten Parameter auf.Assume that the public member indirectly calls the Invoke method on the supplied parameter. Wenn der öffentliche Member nicht die erforderlichen Berechtigungsprüfungen ausführt, ist ein Aufruf Invoke-Methode in jedem erfolgreich, weil das Sicherheitssystem feststellt, dass der Aufrufer hoch vertrauenswürdig ist.If the public member does not perform the necessary permission checks, the call to the Invoke method will always succeed, because the security system determines that the caller is highly trusted. Selbst wenn Schadsoftware nicht die Berechtigung hat, die Methode direkt aufzurufen, kann sie dies weiterhin indirekt durch Aufrufen des öffentlichen Members tun.Even if malicious code does not have the permission to directly invoke the method, it can still do so indirectly by calling the public member.

VersionsinformationenVersion Information

  • Ab .NET Framework 4 kann transparenter Code Reflektion nicht für den Zugriff auf sicherheitskritische Member verwenden.Beginning with the .NET Framework 4, transparent code cannot use reflection to access security-critical members.

  • Das ReflectionPermissionFlag.RestrictedMemberAccess-Flag wurde in .NET Framework 2.0 Service Pack 1 eingeführt.The ReflectionPermissionFlag.RestrictedMemberAccess flag is introduced in the .NET Framework 2.0 Service Pack 1. Frühere Versionen von .NET Framework erfordern das ReflectionPermissionFlag.MemberAccess-Flag für Code, in dem Reflektion verwendet wird, um auf nicht öffentliche Member zuzugreifen.Earlier versions of the .NET Framework require the ReflectionPermissionFlag.MemberAccess flag for code that uses reflection to access nonpublic members. Diese Berechtigung sollte in keinem Fall teilweise vertrauenswürdigem Code erteilt werden.This is a permission that should never be granted to partially trusted code.

  • Ab .NET Framework 2.0 sind keine Berechtigungen erforderlich, um über Reflektion Informationen über nicht öffentliche Typen und Member abzurufen.Beginning with the .NET Framework 2.0, using reflection to obtain information about nonpublic types and members does not require any permissions. In früheren Versionen ist ReflectionPermission mit dem ReflectionPermissionFlag.TypeInformation-Flag erforderlich.In earlier versions, ReflectionPermission with the ReflectionPermissionFlag.TypeInformation flag is required.

Siehe auchSee also