Sichern des Methodenzugriffs
Bei einigen Methoden empfiehlt es sich nicht, Aufrufe durch beliebigen, nicht vertrauenswürdigen Code zuzulassen. Diese Methoden bergen einige Risiken: Die Methode kann vertrauliche Daten enthalten, sie kann alle an sie übergebenen Informationen akzeptieren, die Parameter werden möglicherweise nicht auf Fehler überprüft bzw. es werden die falschen Parameter überprüft, und es können Fehler auftreten bzw. schädliche Vorgänge ausgeführt werden. Verlieren Sie dies nicht aus den Augen, und ergreifen Sie geeignete Maßnahmen zum Schutz der Methode.
Gelegentlich müssen Sie Methoden einschränken, die nicht für die öffentliche Verwendung bestimmt sind, jedoch trotzdem öffentlich sein müssen. Ein Beispiel: Sie verfügen über eine Schnittstelle, die über eigene DLLs aufgerufen wird und daher öffentlich sein muss. Sie soll jedoch nicht für alle Benutzer verfügbar gemacht werden, d. h., Kunden sollen sie nicht verwenden können, und bösartigem Code soll der Zugang zur Komponente verwehrt werden. Häufig wird eine nicht für die öffentliche Verwendung bestimmte Methode (die trotzdem öffentlich sein muss) beschränkt, um Dokumentations- und Supportpflichten für eine Schnittstelle zu umgehen, die für interne Zwecke vorgesehen ist.
Mit verwaltetem Code kann der Codezugriff auf mehrere Arten eingeschränkt werden:
Eingrenzen des Gültigkeitsbereichs für den Zugriff auf die Klasse, die Assembly oder die abgeleiteten Klassen, wenn diese vertrauenswürdig sind. Dies ist die einfachste Methode zum Einschränken des Methodenzugriffs. Beachten Sie, dass abgeleitete Klassen im Allgemeinen weniger vertrauenswürdig sind als die Klasse, von der sie abgeleitet sind, obwohl sie in einigen Fällen die Identität der übergeordneten Klasse aufweisen. Leiten Sie insbesondere vom Schlüsselwort protected keine Vertrauenswürdigkeit ab, denn dieses wird nicht unbedingt im Sicherheitskontext verwendet.
Beschränken Sie den Methodenzugriff auf Aufrufer mit einer bestimmten Identität, d. h. auf bestimmte ausgewählte Beweise (starker Name, Herausgeber, Zone usw.).
Beschränken Sie den Methodenzugriff auf Aufrufer mit den von Ihnen ausgewählten Berechtigungen.
Mithilfe von deklarativer Sicherheit können Sie die Vererbung von Klassen auf ähnliche Weise steuern. Mit InheritanceDemand können Sie Folgendes ausführen:
Legen Sie fest, dass abgeleitete Klassen eine bestimmte Identität oder Berechtigung aufweisen müssen.
Legen Sie fest, dass abgeleitete Klassen, die bestimmte Methoden überschreiben, eine bestimmte Identität oder Berechtigung aufweisen müssen.
Das folgende Beispiel veranschaulicht das Schützen einer öffentlichen Klasse durch beschränkten Zugriff, indem gefordert wird, dass Aufrufer mit einem bestimmten starken Namen signiert sein müssen. In diesem Beispiel wird StrongNameIdentityPermissionAttribute mit Demand für den starken Namen verwendet. Weitere Informationen über die Vorgehensweise beim Signieren einer Assembly mit einem starken Namen finden Sie unter Erstellen und Verwenden von Assemblys mit starkem Namen.
<StrongNameIdentityPermissionAttribute(SecurityAction.Demand, PublicKey := "…hex…", Name := "App1", Version := "0.0.0.0")> _
Public Class Class1
End Class
[StrongNameIdentityPermissionAttribute(SecurityAction.Demand, PublicKey="…hex…", Name="App1", Version="0.0.0.0")]
public class Class1
{
}