Galileo Computing <openbook>
Galileo Computing - Programming the Net
Galileo Computing - Programming the Net


JavaScript von Christian Wenz
Browserübergreifende Lösungen
JavaScript - Zum Katalog
gp Kapitel 21 Signierte Skripten
  gp 21.1 Zusätzliche Rechte
  gp 21.2 Signieren

Kapitel 21 Signierte Skripten

Es gibt keine Sicherheit, nur verschiedene Grade der
Unsicherheit.
– Anton Neuhäusler

An einigen Stellen in diesem Buch war von den Sicherheitsmechanismen von JavaScript die Rede. Insbesondere ging es darum, dass man mit JavaScript keine sensitiven Daten auslesen kann. Sensitiv bedeutet, dass es sich um ein potenzielles Sicherheitsrisiko handelt, wenn die Daten auslesbar sind. Beispielsweise kann man nicht auf die URL eines Dokuments in einem Unterframe zugreifen. Erstens geht es niemanden etwas an, wohin man surft (außer, man benutzt die Leitungen seines Arbeitgebers), und außerdem könnten so geheime URLs publik werden, beispielsweise von nicht gesicherten Intranet-Seiten.

In diesem Kapitel werden Wege vorgestellt, diese zusätzlichen Rechte zu erhalten. Im Intranet-Einsatz kann das mitunter ganz nützlich sein; im World Wide Web ist das Vorgehen nicht empfehlenswert, denn selbstredend wird der Benutzer darauf hingewiesen, dass ein Skript zusätzliche Rechte fordert.

Wenn ein Skript schon besondere Rechte haben will, steht der Benutzer vor der schwierigen Entscheidung, ob er dem Skript überhaupt diese Rechte geben will. Man kann das Skript dann signieren: Man erwirbt dazu ein Zertifikat bei einer unabhängigen Authorisierungsbehörde und kann dann seine Skripte mit seiner persönlichen Signatur versehen. Der Benutzer sieht dann, von wem das Skript kommt, und stimmt dann eventuell eher zu (zumindest, wenn er den Skriptersteller persönlich kennt). Aber dazu später mehr.

gp  Das Sicherheitskonzept wurde beim Netscape Navigator 4 komplett neu erstellt; die folgenden Beispiele funktionieren also weder beim Internet Explorer noch bei älteren Netscape-Versionen.

Galileo Computing

21.1 Zusätzliche Rechte  downtop

Wie bereits in der Einleitung und in vorhergehenden Kapiteln erwähnt, scheitern manche JavaScript-Aktionen an Sicherheitsvorkehrungen des JavaScript-Interpreters. Beispiele sind das Auslesen von Daten aus Dokumenten in einem anderen Frame, sofern diese Dokumente auf einem anderen Webserver liegen, oder das Erzeugen bestimmter Fenster (Sie erinnern sich vielleicht noch an die Auflistung im Kapitel »Fenster II«).


Galileo Computing

21.1.1 Allgemeines  downtop

Die erweiterten Rechte werden anhand von Java-Klassen beantragt, die beim Netscape Navigator 4 mitgeliefert sind. Die allgemeine Syntax lautet:

netscape.security.PrivilegeManager.enablePrivilege(Privileg)

Mit Privileg wird hier die Zeichenkette bezeichnet, die das Privileg angibt, das das Skript beantragt. Man unterscheidet zwischen Privilegien mit mittlerem Risiko und Privilegien mit hohem Risiko. In der Tabelle 21.1 sehen Sie alle Privilegien mit mittlerem und hohem Risiko:

Tabelle 21.1  Privilegien mit hohem Risiko
Privileg Beschreibung
UniversalBrowserRead Lesezugriff auf sensible Daten, beispielsweise Dokumente von anderen Domains in einem Unterframe.
UniversalPreferencesRead Lesezugriff auf die persönlichen Einstellungen des Benutzers (inklusive E-Mail-Adresse, Mailserver-Benutzername etc.).
UniversalSendMail Versand von E-Mails vom Konto des Benutzers.
UniversalBrowserAccess Lese- und Schreibzugriff auf sensible Daten, beispielsweise Dokumente von anderen Domains in einem Unterframe; Erzeugung von besonderen Fenstern (etwa außerhalb des Bildschirms).
UniversalBrowserWrite Erzeugung von besonderen Fenstern (etwa außerhalb des Bildschirms).
UniversalFileAccess Lese- und Schreibzugriff auf Dateien auf dem Rechner des Benutzers.
UniversalFileRead Lesezugriff auf Dateien auf dem Rechner des Benutzers.
UniversalFileWrite Schreibzugriff auf Dateien auf dem Rechner des Benutzers.
UniversalPreferencesWrite Schreibzugriff auf die persönlichen Einstellungen des Benutzers.

Sie sehen bereits, dass man mit diesen speziellen Rechten schlimme Dinge auf dem Rechner des Benutzers anstellen kann. Aber wie gesagt, er muss erst einmal zustimmen, und die Warnmeldung ist mehr als deutlich.


Galileo Computing

21.1.2 Surfüberwachung  downtop

Im ersten Beispiel soll eine Surfüberwachung realisiert werden. Die Seite besteht aus zwei Frames. Während der Benutzer im unteren Frame nach Gutdünken surfen kann, wird im oberen Frame die URL des Dokuments im unteren Frame angezeigt. Normalerweise ist das ja nicht möglich, aber durch die entsprechenden Privilegien kein Problem.

Anhand obiger Tabelle sehen Sie, dass ein Lesezugriff auf den Frame ausreicht, also das Privileg UniversalBrowserRead.

Die Frameset-Datei sieht folgendermaßen aus:

<HTML>
<HEAD>
<TITLE>Surfüberwachung</TITLE>
</HEAD>
<FRAMESET ROWS="100,*">
   <FRAME SRC="watchdog.html">
   <FRAME SRC="http://www.galileo-press.de">
</FRAMESET>
</HTML>

Die Datei watchdog.html schließlich muss die URL des unteren Frames auslesen. Mit setInterval() wird die Adresse periodisch in einen Layer geschrieben.

<HTML>
<HEAD>
<TITLE>Watchdog</TITLE>
<SCRIPT LANGUAGE="JavaScript1.2"><!--
setInterval("dog()", 5000)

function dog(){
   netscape.security.PrivilegeManager.enablePrivilege
     ("UniversalBrowserRead")
   var adr = parent.frames[1].location.href
   with (document.layers[0].document){
      open()
      write(adr)
      close()
   }
}
//--></SCRIPT>
</HEAD>
<BODY>
<H4>Aktuelle URL:</H4>
<LAYER>
---noch keine---
</LAYER>
</BODY>
</HTML>

Sobald Sie diese Seite im Browser laden, erscheint die in Abbildung 21.1 gezeigte Abfrage.

Abbildung 21.1  Sicherheitsabfrage
Abbildung

Sobald der Benutzer das bestätigt, wird die Seite geladen, und alles funktioniert wie geplant (seihe Abbildung 21.2).

Sollte der Benutzer die Sicherheitsabfrage nicht bestätigen, so erhält der Benutzer auch keinen Lesezugriff auf den unteren Frame, sondern eine Fehlermeldung, die in Abbildung 21.3 zu sehen ist.

Abbildung 21.2  Die Surfüberwachung im Einsatz
Abbildung

Abbildung 21.3  Die Fehlermeldung, die erscheint, wenn der Benutzer die zusätzlichen Rechte nicht gewährt.
Abbildung


Galileo Computing

21.1.3 Besondere Fenster  downtop

Wie in vorherigen Kapiteln bereits erwähnt, gibt es einige Sachen, die man mit Fenstern anstellen kann, die nur mit signierten Skripten möglich sind. Dazu gehören Fenster, die weniger breit oder hoch sind als 100 Pixel, oder die sich außerhalb des sichtbaren Bereichs des Bildschirms befinden. Hierzu wird – wie in Tabellen 21.1 //und 21.2// zu sehen – ein Privileg mit großem Risiko benötigt, entweder UniversalBrowserAccess oder UniversalBrowserWrite. Dabei ist UniversalBrowserWrite das schwächere Privileg, also wird es verwendet. Zwei sicherheitskritische Operationen werden ausprobiert:

gp  Erstellen eines Fensters, das niedriger oder schmaler als 100 Pixel ist
gp  Erstellen eines stets sichtbaren Fensters

Im folgenden HTML-Dokument befindet sich ein Formular mit zwei Schaltflächen. Jede dieser Schaltflächen ruft eine der beiden Operationen auf.

<HTML>
<HEAD>
<TITLE>Besondere Fenster</TITLE>
<SCRIPT LANGUAGE="JavaScript1.2"><!--
function fenster1(){
   netscape.security.PrivilegeManager.enablePrivilege
     ("UniversalBrowserWrite")
   var f = window.open("", "", "width=50,height=50")
   netscape.security.PrivilegeManager.disablePrivilege
     ("UniversalBrowserWrite")

   f.document.open()
   f.document.write("50x50")
   f.document.close()
}

function fenster2(){
   netscape.security.PrivilegeManager.enablePrivilege
     ("UniversalBrowserWrite")
   var f = window.open("", "", "width=150,height=150,alwaysRaised")
   netscape.security.PrivilegeManager.disablePrivilege
     ("UniversalBrowserWrite")


   f.document.open()
   f.document.write("immer sichtbar")
   f.document.close()
}
//--></SCRIPT>
</HEAD>
<BODY>
<H3>Besondere Fenster</H3>
<FORM>
<INPUT TYPE="BUTTON" VALUE="50x50" onClick="fenster1()">
<INPUT TYPE="BUTTON" VALUE="immer sichtbar" onClick="fenster2()">
</FORM>
</BODY>
</HTML>
Abbildung 21.4  Das kleine Fenster ist sichtbar, obwohl das große den Fokus hat.
Abbildung

gp  Beachten Sie die Anweisung disablePrivilege("UniversalBrowserWrite"). Es ist günstig, dem Skript ein Privileg sofort wieder zu entziehen, nachdem es nicht mehr gebraucht wird. Sonst können auch andere Seiten die besonderen Rechte wahrnehmen. Analog zu enablePrivilege() wird auch hier das entsprechende Privileg als Zeichenkette übergeben.

Galileo Computing

21.2 Signieren  downtop

Obwohl bis jetzt immer von signierten Skripten die Rede war, war von einer Signatur nicht viel zu sehen. In Abbildung 21.1 heißt es sogar, dass das Skript keine digitale Unterschrift trägt (im Netscape Navigator: not digitally signed). Wie bereits eingangs erwähnt, kann man so darlegen, dass das sicherheitskritische Skript von einem selbst stammt. Sie kennen das Prinzip vielleicht, wenn Sie etwa bei Netscape SmartUpdate eine Sicherheitsabfrage beantworten müssen. Dort heißt es dann nicht, dass das Skript keine digitale Unterschrift trägt, sondern dass es in der Tat signiert ist – von einer Firma namens Netscape. Wenn Sie dieser Firma vertrauen (und darauf baut SmartUpdate auf), können Sie die Sicherheitsabfrage positiv beantworten.


Galileo Computing

21.2.1 Zigbert  downtop

Wenn Sie schon einmal in Java programmiert haben, kennen Sie wahrscheinlich das JAR-Dateiformat. Es handelt sich hierbei um eine Abwandlung des ZIP-Formats. Sie müssen Ihre Skripten in ein JAR-Archiv packen, um sie signieren zu können. Netscape bietet dazu ein Tool an, mit dem Sie das mehr oder minder bequem erledigen können. Es würde den Umfang dieses Buchs sprengen, wenn das hier ausführlich durchexerziert werden würde; aus diesem Grund nachfolgend nur Links auf die entsprechenden Ressourcen, die Sie zum Signieren benötigen:

gp  Um ein Skript zu signieren, benötigen Sie zunächst eine Digitale ID. Diese wird unter anderem von der amerikanischen Firma Verisign, http://www.verisign.com, ausgestellt. Das genaue Zertifikat, das Sie benötigen, heißt Netscape Object Signing Certificate. Je nachdem, ob Sie ein kommerzieller Softwareentwickler sind oder nicht, kostet das Zertifikat ein wenig mehr oder weniger.
gp  Das alte Programm zum Signieren eines Skripts heißt Zigbert und ist bei Netscape unter der URL http://developer.netscape.com/software/ signedobj/zig.html erhältlich. Zum Ausführen von Zigbert benötigen Sie einen Perl-Interpreter. Bei UNIX und Konsorten ist der schon dabei, für andere Betriebssysteme finden Sie unter http://www.perl.com Verweise auf Interpreter für andere Betriebssysteme. Der bekannteste Port für Windows 95/98/NT/ME/2000 heißt ActivePerl und ist von der Firma ActiveState. Sie können den Interpreter unter http://www.activestate.com/ activeperl herunterladen.
gp  Inzwischen gibt es auch ein etwas komfortabler zu bedienendes Tool, das Netscape Object Signing Tool 1.1, welches unter der URL http:// developer.netscape.com/software/signedobj/jarpack.html nebst Dokumentation heruntergeladen werden kann.

Galileo Computing

21.2.2 HTML-Code anpassen  toptop

Das Programm Zigbert erzeugt aus einem Skript und einem digitalen Zertifikat ein JAR-Archiv, welches auf den Webserver überspielt werden muss. Zuvor jedoch muss der HTML-Code angepasst werden. Zum einen muss der Name des JAR-Archivs angegeben werden, und zum anderen ein Identifikator. Dieser Identifikator wird in dem JAR-Archiv mit gespeichert. Der <SCRIPT>-Tag sieht danach also folgendermaßen aus:

<SCRIPT LANGUAGE="JavaScript" ARCHIVE="datei.jar" ID="id">

Weitergehende Informationen finden Sie in der Online-Dokumentation von Netscape unter der Adresse http://developer.netscape.com/docs/ manuals/signedobj/.

  

Webseiten

CSS-Praxis

Kompendium Informations-
technik

Der eigene Webserver

PC-Netzwerke




Copyright © Galileo Press GmbH 2001 - 2002
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken und speichern. Ansonsten unterliegt das <openbook> denselben Bestimmungen wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.
Die Veröffentlichung der Inhalte oder Teilen davon bedarf der ausdrücklichen schriftlichen Genehmigung von Galileo Press. Falls Sie Interesse daran haben sollten, die Inhalte auf Ihrer Website oder einer CD anzubieten, melden Sie sich bitte bei: stefan.krumbiegel@galileo-press.de


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, fon: 0228.42150.0, fax 0228.42150.77, info@galileo-press.de