All diese Sicherheitsbestimmungen werden dabei im Kontext des Applets (z.B.
über applet.getAppletContext() erreichbar), in dem das Applet abläuft
von zwei zentralen Instanzen kontrolliert: Der ClassLoader [Js]
und der SecurityManager. Der ClassLoader überwacht das Laden
des Bytecodes der Klassen und die Zuordnung zu den jeweiligen Namensräumen.
Da ein Applet nicht in der Lage sein soll, Systemklassen zu überschreiben
oder die Klassen anderer Applets zu manipulieren, wird jedem Applet ein
eigener separater Namensraum zugeordnet. Zusätzlich überprüft der sog.
Verifier des ClassLoaders die Gültigkeit des Byte-Codes, da es ansonsten
einem absichtlich fehlerhaften Bytecode erlaubt wäre, durch Erzwingen eines
Stacküberlaufs oder -unterlaufs die Virtual Machine in einen undefinierten und
damit gefährdeten Zustand zu bringen. Erst wenn der heruntergeladene Code
den Verifier durchlaufen hat, wird er an die Virtual Machine weitergereicht
und gelangt zur Ausführung.
Um potentiell gefährliche Aktionen während der Ausführung zu überwachen, wird
der SecurityManager verwendet. Er kontrolliert Aktionen wie z.B.
Datei- und Netzwerkzugriff und verbietet diese bei fehlender Erlaubnis. Wird
ein SecurityManager in einem Java-Programm mittels
System.setSecurityManager() installiert, so
wird etwa bei jedem lesenden Dateizugriff zunächst die Methode
SecurityManager.checkRead() aufgerufen, welche die Gültigkeit des
Zugriffs anhand verschiedener Parameter überprüft. Bei fehlender Erlaubnis
(was bei einem Applet standardmäßig der Fall ist) wird eine
SecurityException ausgelöst, was den Vorgang unterbindet. Ein
Programm-Beispiel hierzu findet sich in [Cam96].
Interessant im Hinblick auf verteilte Systeme ist sicherlich die
Einschränkung der erlaubten Netzwerkverbindungen eines Applets auf den
Server, von dem es heruntergeladen wurde, sowie das Verbot, eingehende
Nachrichten entgegenzunehmen. Ersteres bedeutet, daß Nachrichten an
andere Server über den Ursprungsserver umgeleitet werden müßten. Die
zweite Einschränkung bedeutet, daß ein Applet nur Nachrichten vom
Server über eine Verbindung empfangen kann, die es selbst aufgebaut
hat. Damit sind zum Beispiel IIOP-Requests, die eine neue Verbindung
aufbauen, für ein Applet nicht entgegennehmbar, was zur Folge hat, daß
ein solches Applet keine CORBA-Server-Funktionalität implementieren kann.
Glücklicherweise gibt es aber Möglichkeiten, diese Einschränkungen zu umgehen
bzw. aufzuheben, ohne die Sicherheit des Gesamtsystems zu beeinträchtigen.