Anzeige
Tutorialbeschreibung

Javascript und Ajax - Signierte Skripte

Javascript und Ajax - Signierte Skripte

Das nun folgende Tutorial ist ein Auszug aus der 7. Auflage des Buches: JavaScript und Ajax von Christian Wenz.

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

Kapitel 29 Signierte Skripte

An einigen Stellen in diesem Buch war von den Sicherheitsmechanismen von JavaScript die Rede. Insbesondere ging es darum, dass man mit JavaScript keine sensiblen Daten auslesen kann. Sensibel bedeutet, dass es sich um ein potenzielles Sicherheitsrisiko handelt, wenn die Daten ausgelesen werden können. 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 Verfahren vorgestellt, um 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 selbstverständlich wird der Benutzer darauf hingewiesen, dass ein Skript zusätzliche Rechte fordert.

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

Das Sicherheitskonzept wurde beim Netscape Navigator 4 komplett neu erstellt; die folgenden Beispiele funktionieren also weder beim Internet Explorer noch bei älteren Netscape-Versionen. Sie sind aber vermutlich primär an aktuellen Mozilla-Browsern interessiert. Die gute Nachricht: Die Ansteuerung ist weitestgehend identisch. Allerdings werden die erweiterten Zugriffsrechte standardmäßig offensichtlich nur bei lokalen Dateien unterstützt.

 

29.1 Zusätzliche Rechte

Wie bereits in der Einleitung und in vorangegangenen Kapiteln erwähnt wurde, 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 in Kapitel 10).


29.1.1 Allgemeines 

Die erweiterten Rechte werden anhand von Java-Klassen beantragt, die bei Netscape und Mozilla mitgeliefert werden. 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 folgenden Tabelle sehen Sie alle Privilegien mit mittlerem und hohem Risiko:


 

Tabelle 29.1     Privilegien mit mittlerem und 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 auf 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, der Benutzer muss erst einmal zustimmen, und die Warnmeldung ist mehr als deutlich.


29.1.2 Surfüberwachung 

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 angezeigt, das man im unteren Frame sieht. Normalerweise ist das ja nicht möglich, aber durch die entsprechenden Privilegien kein Problem.

Anhand der vorherigen 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 ein <div>-Element geschrieben.

<html>

<head>

<title>Watchdog</title>

<script type="text/javascript">

setInterval("dog()", 5000)

 

function dog() {

   netscape.security.PrivilegeManager.enablePrivilege(

      "UniversalBrowserRead");

   var adr = parent.frames[1].location.href;

   document.getElementById("ausgabe").innerHTML = adr;

}

</script>

</head>

<body>

<h1>Aktuelle URL:</h1>

<div id="ausgabe">

---noch keine---

</div>

</body>

</html>

Sobald Sie diese Seite im Browser laden (lokal, nicht über den Webserver!), erscheint die in Abbildung 2.1 gezeigte Abfrage.


Bilder

Abbildung 29.1     Sicherheitsabfrage

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

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


Bilder

Abbildung 29.2     Die Surfüberwachung im Einsatz


Bilder

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


29.1.3 Besondere Fenster  

Wie in den vorangegangenen Kapiteln bereits erwähnt wurde, 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 der Tabelle weiter oben zu sehen ist – ein Privileg mit großem Risiko benötigt, entweder UniversalBrowserAccess oder UniversalBrowserWrite. Dabei ist UniversalBrowserWrite das schwächere Privileg, also verwenden wir es hier. Wir probieren zwei sicherheitskritische Operationen aus:

gpBilder
 

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

 

gpBilder
 

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 type="text/javascript">

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>

<h1>Besondere Fenster</h1>

<form>

<input type="button" value="50x50" onclick="fenster1();" />

<input type="button" value="immer sichtbar" onclick="fenster2();" />

</form>

</body>

</html>


Bilder

Abbildung 29.4     Das Fenster ist eigentlich kleiner als erlaubt.

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.

29.2 Signieren 

Obwohl bis jetzt immer von signierten Skripten die Rede war, war von einer Signatur nicht viel zu sehen. Wie bereits eingangs erwähnt wurde, kann man so nachweisen, dass das sicherheitskritische Skript von einem selbst stammt.

 

29.2.1 SignTool 

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 wir das hier ausführlich durchexerzieren würden; aus diesem Grund gebe ich nachfolgend nur Links auf die entsprechenden Ressourcen an, die Sie zum Signieren benötigen:

>

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 Code Signing Digital ID. Der Preis für ein Zertifikat hängt davon ab, ob Sie ein kommerzieller Softwareentwickler sind oder nicht. Auf der Seite http://www.verisign.com/products-services/ security-services/code-signing/digital-ids-code-signing/ finden Sie nähere Informationen.

 

>

Das Softwarepaket NSS (erhältlich unter http://ftp.mozilla.org/pub/mozilla.org/security/nss/releases/) enthält SignTool, ein Hilfswerkzeug zum Signieren von Code.

 

>

Außerdem benötigen Sie noch NSPR, das ebenfalls auf dem Mozilla-FTP-Server verfügbar ist (http://ftp.mozilla.org/pub/mozilla.org/nspr/releases/).

Nähere Informationen zum Signieren von Code für Mozilla erhalten Sie unter http://www.mozilla.org/projects/security/components/signed-scripts.html.


29.2.2 HTML-Code anpassen 

Das Programm SignTool erzeugt aus einem Skript und einem digitalen Zertifikat ein JAR-Archiv, das 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. Das <script>-Tag sieht danach also folgendermaßen aus:

<script type="text/javascript" archive="datei.jar" id="id">

</script>

Das Tutorial ist ein Auszug aus der 7. Auflage des Buches von Christian Wenz:

JavaScript und Ajax - Das umfassende Handbuch
Galileo Computing, 853 Seiten, 8. aktualisierte Auflage

Die Veröffentlichung des Kapitels erfolgt mit freundlicher Genehmigung von Galileo Press.

Mehr Informationen zum aktualisierten Fachbuch für Webentwickler gibt es hier: JavaScript und Ajax
 
Alle Kapitel des Buches:
1 Grundlagen
2 JavaScript-Praxis
3 Professionelles JavaScript
4 Web 2.0 und Ajax
5 Kommunikation
6 Serverseitige Programmierung
7 Sicherheit
8 Praxis
9 Anhang
Bilder


 

DVD-Werbung
Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von Monkeyman26
  • 11.01.2018 - 15:21

Danke für das Tutorial.

x
×
×