2010-10-18 12 views
7

Ich habe gerade über diese article über Code Access Security gelesen. Es hat ein solches Beispiel darin:Code Access Security ist ein Witz?

using System.Security.Permissions; 
public class MyFileAccessor 
{ 
    public MyFileAccessor(String path, bool readOnly) 
    { 
    path = MakeFullPath(path); // helper fcn 
    FileIOPermissionAccess desiredAccess = readOnly 
     ? FileIOPermissionAccess.Read 
     : FileIOPermissionAccess.AllAccess; 
    FileIOPermission p = new FileIOPermission(desiredAccess, path); 
    p.Demand(); 
    // 
    ••• 
    open the file 
    } 
    // ••• 
} 

Was passiert, wenn ich nicht die ganze FileIOPermissionAccess Typ und nie includ Code wie p.Demand() in meinem Code verwendet haben? Mit anderen Worten, Wenn ich etwas Schlechtes tun möchte, warum sollte ich mich darum kümmern, die Erlaubnis dafür zu verlangen? Ist es nicht ein Scherz? Oder habe ich es falsch verstanden?

Antwort

7

Nun, ja, das Beispiel ist ein bisschen ein Witz, Sie würden nie selbst so etwas schreiben. Was fehlt, ist der wirklich wichtige Teil, der Code, // der die Datei öffnet. Eine realistische Version würde, sagen wir, pinvoke CreateFile().

Der Punkt ist, dass Windows nichts über CAS weiß.Wenn Sie also eine Dienstprogrammfunktion wie diese bereitstellen und die CAS-Regeln erzwingen möchten, müssen Sie überprüfen, ob Ihr Aufrufcode über die erforderliche Berechtigung verfügt. Natürlich gehört diese Art von Code wirklich nur in das .NET-Framework. Sehen Sie sich FileStream.Init() an und beachten Sie, dass FileIOPermission dort vor dem CreateFile-Aufruf angefordert wird.

+0

Danke für Ihre klare Antwort. Der Punkt ist also - um das * Missbrauch * meines Codes zu verhindern, sollte ich einen bestimmten CAS-Code in meine Komponente/Funktion aufnehmen, um CAS-Regeln durchzusetzen. – smwikipedia

+0

Grob. Nicht so sicher, das Wort "missbrauchen" ist angemessen, wenn Sie eine Möglichkeit für Code bieten, die normale CAS-Prüfung zu umgehen, die in das Framework eingebaut ist, dann müssen Sie die Verantwortung übernehmen, um sie selbst durchzusetzen. –

4

Dateizugriff (zum Beispiel mit FileStream) wird automatisch FileIOPermission anfordern. Und das gilt für alle Standardklassen. Wenn sie Aktionen ausführen, für die eine Berechtigung erforderlich ist, werden sie diese automatisch anfordern. Sehen Sie unter .NET Framework-Sicherheit here. Der Beispielcode ist also nutzlos, niemand wird explizit Dateiberechtigungen anfordern. Es ist sinnvoll, wenn Sie eine API entwickeln und Ihr Code signiert ist, damit niemand ihn ändern kann.

weiter lesen, hier ist Zitat aus diesem Artikel:

nun in der realen Welt, werden Sie nicht Klassen wie MyFileAccessor sein Schreiben von Dateien zuzugreifen. Stattdessen verwenden Sie vom System bereitgestellte Klassen wie System.IO.FileStream, die bereits dazu entwickelt wurden, die entsprechenden Sicherheitsprüfungen für Sie durchzuführen. Sie werden oft im Konstruktor mit allen Auswirkungen auf Leistung und Sicherheit ausgeführt, die ich bereits erwähnt habe.

+0

Vielen Dank für Ihre Antwort. Was ist, wenn ich eine neue Klasse mache? Bedeutet dies, dass, um CAS zum Funktionieren zu bringen, eine ** Kollaboration/Vereinbarung ** zwischen dem ** ehrlichen ** Entwickler und der CAS-Infrastruktur stattfinden muss? Ich halte es für total vergeblich, was die Sicherheit betrifft. – smwikipedia

+0

Oder sollten wir immer die von ** ehrlichen ** Entwicklern geschriebene Softwarekomponente verwenden? – smwikipedia

+0

@smwikipedia No: "Alle .NET Framework-Klassen, die eingeschränkte Operationen ausführen und auf eingeschränkte Ressourcen wie das Dateisystem zugreifen, fordern Berechtigungen für Sie. Wenn Sie die .NET Framework-Klassen verwenden, dürfen Sie daher die Berechtigungsanforderungen nicht duplizieren. " http://support.microsoft.com/kb/315529 Fälle, in denen Sie ausdrücklich Berechtigungen anfordern, sind vage für mich. Ich weiß nichts Nützliches. – Andrey

3

Innerhalb der java.io-APIs können Sie sich selbst versichern, dass die Prüfungen durchgeführt werden. Wenn Sie den Zugriff kontrollieren möchten (indem Sie einen Absturz umgehen, bevor dieser auftritt), müssen Sie VOR den internen Prüfungen, die von den API-Aufrufen durchgeführt werden, entsprechende Prüfungen vornehmen.

Java-Code läuft oft auf Computern, die Sie steuern, aber oft auch auf Computern, die Sie nicht steuern. Denken Sie an Java-Applets. Sie sollten um Erlaubnis bitten, auf das Dateisystem zuzugreifen, da dem Autor des Programms kein ungehinderter Zugriff auf das Dateisystem aller anderen erlaubt sein sollte.

Wenn Sie eine Gruppe von Leuten davon abhalten müssen, etwas Böswilliges zu tun, dann müssen Sie jeden davon abhalten, etwas Schädliches zu tun, damit die Sicherheit real ist. Andernfalls werden die Übeltäter nur sagen, dass sie Teil der vertrauenswürdigen Gruppe sind.

Die ausführbare Java-Befehlszeile wird standardmäßig mit Berechtigungen ausgeführt, damit Sie Ihr eigenes Dateisystem berühren können. Die Annahme ist, dass Sie, wenn Sie das Programm lokal gestartet haben, die Teile Ihres Dateisystems durcheinander gebracht haben könnten, auf die Sie Zugriff hatten. Applets starten mit all diesen Standardrechten, die entfernt wurden. Auf diese Weise muss die Person, die die Webseite durchsucht, auf der sich das Applet befindet, manuell Berechtigungen für ein Remote-Programm (Applet) erteilen, um ihr Dateisystem zu berühren.

Das ist der Beweis, dass es keine spezielle Hintertür gibt, die die Sicherheit für einige Benutzer (oder unter bestimmten Bedingungen) umgeht.

+0

Sorry, antwortete auf Java, aber .Net ist so ähnlich, dass die Antwort immer noch gilt. –

+0

Nein. Frage war was, wenn ich nicht "Nachfrage" nannte, also ist es sehr spezifisch und Sie erzählen der wohlbekannten Theorie – Andrey