Sicherheitsüberlegungen für die Reflektion

Aktualisiert: November 2007

Reflektion bietet die Möglichkeit, Informationen über Typen und Member abzurufen und auf Member zuzugreifen. Der Zugriff auf nicht öffentliche Member könnte zu einem Sicherheitsrisiko führen. Daher erfordert Code, der auf nicht öffentliche Member zugreift, ReflectionPermission mit den entsprechenden Flags. Darüber hinaus ist SecurityPermission für einige Aufgaben erforderlich, wie z. B. die Bereitstellung von Beweisen, die Ausführung von nicht verwaltetem Code und die Serialisierung von Objekten.

In jedem Code kann Reflektion ohne Berechtigung für folgende Aufgaben eingesetzt werden:

  • Auflisten von Typen und Membern und Prüfen ihrer Metadaten

  • Auflisten und Prüfen von Assemblys und Modulen

  • Zugreifen auf öffentliche Member

  • Zugreifen auf protected-Member der Basisklassen des aufrufenden Codes (In Reflektion wird dies als Zugriff auf Familienebene bezeichnet.)

  • Zugreifen auf internal-Member (Friend-Member in Visual Basic) in der Assembly des aufrufenden Codes (In Reflektion wird dies als Zugriff auf Assemblyebene bezeichnet.)

Zugreifen auf nicht öffentliche Member

Um mit Reflektion Methoden aufzurufen, die nach den Zugriffsregeln der Common Language Runtime nicht zugänglich sind, muss Ihrem Code eine von zwei Berechtigungen gewährt werden:

  • Damit Code einen beliebigen nicht öffentlichen Member aufrufen kann: ReflectionPermission mit dem ReflectionPermissionFlag.MemberAccess-Flag.

    Hinweis:

    Standardmäßig verweigert die Sicherheitsrichtlinie diese Berechtigung für Code, der über das Internet bereitgestellt wurde. Code, der aus dem Internet stammt, sollte diese Berechtigung nie gewährt werden.

  • Damit Code einen beliebigen nicht öffentlichen Member aufrufen kann, wenn der Berechtigungssatz der Assembly, die den aufgerufenen Member enthält, mit dem Berechtigungssatz des aufrufenden Codes identisch ist oder eine Untermenge dieses Berechtigungssatzes darstellt: ReflectionPermission mit dem 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.

  • Assembly A kann Reflektion verwenden, um auf private Member von Assembly B zuzugreifen, da der Berechtigungssatz von Assembly B keine Berechtigungen enthält, die A nicht gewährt wurden.

  • Assembly A kann Reflektion nicht verwenden, um auf private Member von .NET Framework-Assemblys wie mscorlib.dll zuzugreifen, da mscorlib.dll voll vertrauenswürdig ist und daher Berechtigungen hat, die Assembly A nicht gewährt wurden. Eine MemberAccessException wird ausgelöst, wenn Codezugriffssicherheit den Stapel zur Laufzeit durchläuft.

Ein Beispiel für eine Sandbox-Anwendungsdomäne, die ReflectionPermission mit dem ReflectionPermissionFlag.RestrictedMemberAccess-Flag gewährt, finden Sie unter Exemplarische Vorgehensweise: Ausgeben von Code in Szenarios mit teilweiser Vertrauenswürdigkeit.

Serialisieren

Zum Serialisieren stellt SecurityPermission mit dem SecurityPermissionAttribute.SerializationFormatter-Flag die Möglichkeit bereit, Member von serialisierbaren Typen unabhängig vom Zugriff abzurufen und festzulegen. Mit dieser Berechtigung kann Code den privaten Status einer Instanz erkennen und ändern. (Der Typ muss nicht nur über die entsprechenden Berechtigungen verfügen, sondern auch in den Metadaten als serialisierbar markiert sein.)

Überprüfen von Verknüpfungsanforderungen

Verfügt eine Methode oder ein Delegat über einen LinkDemand für die Berechtigung P, wird der Aufrufer der Methode oder des Delegaten durch die Laufzeit hinsichtlich des Verknüpfungsaufrufs überprüft, um sicherzustellen, das dem Aufrufer die Berechtigung P gewährt wurde. Diese Überprüfung des Verknüpfungsaufrufs wird zweimal durchgeführt, einmal für die Ermittlung der Typinformationen und einmal für den Typaufruf.

Vermeiden der Erstellung von Parametern vom Typ MethodInfo

Vermeiden Sie es, öffentliche APIs zu schreiben, die MethodInfo-Parameter erhalten, besonders bei hoch vertrauenswürdigem Code. Diese APIs könnten anfälliger für böswilligen Code sein. Beispiel: Eine öffentliche API in hoch vertrauenswürdigem Code erhält einen MethodInfo-Parameter. Angenommen, die öffentliche API ruft die Invoke-Methode für den bereitgestellten Parameter auf. Ohne Überprüfen der Berechtigung durch die öffentliche API wäre der Aufruf der Invoke-Methode in jedem Fall erfolgreich, da das Sicherheitssystem feststellen würde, dass der Aufrufer hoch vertrauenswürdig ist. Auch wenn böswilliger Code nicht zum direkten Aufruf der Methode berechtigt ist, ist dies trotzdem indirekt über einen Aufruf des öffentlichen API möglich.

Versionsinformationen

Das ReflectionPermissionFlag.RestrictedMemberAccess-Flag wird in .NET Framework Version 2.0 Service Pack 1 eingeführt. Frühere Versionen von .NET Framework erfordern das ReflectionPermissionFlag.MemberAccess-Flag für Code, der Reflektion verwendet, um auf nicht öffentliche Member zuzugreifen. Diese Berechtigung sollte in keinem Fall teilweise vertrauenswürdigem Code erteilt werden.

Hinweis:

Zur Verwendung des ReflectionPermissionFlag.RestrictedMemberAccess-Flags sollte die Anwendung für .NET Framework Version 3.5 ausgelegt sein. Weitere Informationen finden Sie unter Architektur von .NET Framework 3.5.

Ab .NET Framework 2.0 erfordert die Verwendung von Reflektion, um Informationen über nicht öffentliche Typen und Member abzurufen, keinerlei Berechtigungen. In früheren Versionen ist ReflectionPermission mit dem ReflectionPermissionFlag.TypeInformation-Flag erforderlich.

Siehe auch

Konzepte

Sicherheitsaspekte bei der Reflektionsausgabe

Anzeigen von Typinformationen

Anwenden von Attributen

Zugreifen auf benutzerdefinierte Attribute

Referenz

ReflectionPermissionFlag

ReflectionPermission

SecurityPermission