Das Verständnis der CAS-Sicherheit ist wichtig für die Entwicklung und Architektur von .NET-Anwendungen und -Bibliotheken.
Eine gute Möglichkeit, die CAS-Sicherheit zu verstehen, besteht darin, über das Problem nachzudenken, dem die Benutzer beim Schreiben von Bibliotheken gegenüberstehen, die auf Client-Computern installiert werden. Wie schützt man diese Bibliotheken vor Missbrauch durch nicht vertrauenswürdigen Code (z. B. EvilMethod() in Evil.dll in einem .xbap unter www.evil.com)?
CAS beantwortet diese Frage durch Kontrollen anhand von Eigenschaften des anrufenden Code, wie seine starken Namen zu tun, die durch das System zu dem anrufenden Code erteilten Berechtigungen, wird die Zone Code ausgeführt wird, von etc.
I Ich gebe Ihnen ein Beispiel: Sie haben die Aufgabe, eine spezielle Druckbibliothek zu entwickeln, die auf den Client-Rechnern eines großen Unternehmens installiert (GAC) wird, und diese Bibliothek darf nur von Methoden aufgerufen werden, die in Baugruppen, die der Firma gehören.
CAS kann Ihnen hier helfen. Grundsätzlich sollten Sie in der Lage sein, den starken Namen der Anrufer in den öffentlich exponierten Methoden zu überprüfen:
void Print(string toPrint)
{
new System.Security.Permissions.StrongNameIdentityPermission(blob, "My Company Inc.", new Version("1.0.0.0")).Demand();
// print code
}
Nun sagen Sie, ein Verfahren auszusetzen haben, eine Testseite zu drucken. Möglicherweise möchten Sie, dass diese Methode von allen aufgerufen wird, nicht nur von den Assemblys Ihres Unternehmens. Was ist zu tun?
Sie können Assert(), um die Erlaubnis, so dass der Stapel zu Fuß (Nachfrage) wird in dem Rahmen geschnitten und überprüft nicht, Ihre Anrufer:
void PrintTestPage()
{
new System.Security.Permissions.StrongNameIdentityPermission(blob, "My Company Inc.", new Version("1.0.0.0")).Assert();
Print("Test Page");
}
Sehen Sie, wie wir nur Assert() die Erlaubnis, wenn aussetzt eine sichere Version einer API (denke an ein Assert() wie ein Frame, der sagt: "Hör auf, meine Anrufer zu überprüfen! - Ich weiß, was ich mache, und ich bin sicher, von bösartigem Code angerufen zu werden").
This ist eine gute Lektüre für das Thema.
Warum gibt es nicht so etwas für native Bibliotheken? Liegt es daran, dass es so viel einfacher ist, "ausnutzbaren Code" in .net-Bibliotheken zu finden, als in nativen DLLs? (viel einfacher zu zerlegen?) – Vegar