Sicherheitsüberlegungen für die Reflektion

Wird der Zugriff auf nicht öffentliche Informationen gewährt, birgt dies Sicherheitsrisiken. Über Code, der Zugang zu nicht öffentlichen Typinformationen hat, kann potenziell auf Code, Daten und andere Informationen zugegriffen werden, die privat bleiben sollen. Aus diesem Grund erzwingt das Sicherheitskonzept von .NET Framework Regeln, die festlegen, in welchem Ausmaß Reflektion für den Zugriff auf Typinformationen und Typen verwendet werden darf. Je nachdem, welche Operation ausgeführt werden soll, kann ReflectionPermission oder SecurityPermission für die Serialisierung erforderlich sein.

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

  • Ermitteln von Informationen über öffentliche Typen und ihre öffentlichen Member.

  • Ermitteln von Information über Modul und Assembly des Codes.

  • Auflisten öffentlicher Typen.

  • Auflisten nicht öffentlicher Typen, die sich in derselben Assembly wie der Code befinden, der Reflektion verwendet.

  • Auflisten von Assemblys und Modulen.

  • Aufrufen öffentlicher Member.

  • Aufrufen von Membern mit Familienzugriff der Basisklassen des aufrufenden Codes.

  • Aufrufen von Assembly-Zugriffsmembern der Basisklassen des aufrufenden Codes.

Um Informationen über nicht öffentliche Member zu erhalten, müssen Aufrufer über ReflectionPermission verfügen, die zum Erhalt von Typinformationen berechtigt. Ohne diese Berechtigung kann Code Reflexion nicht verwenden, um Informationen über nicht-öffentliche Member (selbst die der eigenen Klasse) mithilfe der Get-Methoden für Type, Assembly und Module zu erhalten.

Um mit Reflektion Methoden aufzurufen oder auf Felder zuzugreifen, die nach den Zugriffsregeln des allgemeinen Typsystems nicht zugänglich sind, muss dem Code ReflectionPermission für den Zugriff auf Member gewährt werden.

Hinweis

Es empfiehlt sich, dass die Sicherheitsrichtlinien ReflectionPermission für Code aus dem Internet verweigern.

Durch SecurityPermission zur Serialisierung wird gestattet, permanente Datenmember (d. h. Member, die nicht nur im Speicher vorhanden sind) serialisierbarer Typen zu erhalten und festzulegen, unabhängig von der Zugänglichkeit. Diese Berechtigung erlaubt es, auf den privaten Status einer Instanz zuzugreifen und ihn zu ä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 eine Berechtigung P, wird der Aufrufer der Methode oder des Delegaten durch die Runtime 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 Typinformation und einmal für den Typaufruf.

Vermeiden Sie es, öffentliche APIs zu schreiben, die MethodInfo-Parameter erhalten, besonders bei hoch vertrauenswürdigem Code. Die Zugriffsberechtigungen könnten anfälliger für böswilligen Code sein. Ein Beispiel: Ein öffentliches API in hoch vertrauenswürdigem Code erhält einen MethodInfo-Parameter. Angenommen, das öffentliche API ruft indirekt MethodInfo.Invoke für den bereitgestellten Parameter auf. Ohne Überprüfen der Berechtigung durch das ö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.

Siehe auch

Referenz

ReflectionPermissionFlag.TypeInformation
ReflectionPermissionFlag.MemberAccess
SecurityPermission

Konzepte

Anzeigen von Typinformationen
Anwenden von Attributen
Zugreifen auf benutzerdefinierte Attribute