Kann ein Browser auf lokale Dateien zugreifen?

Die Antwort lautet: "ja". Ganz allgemein gesprochen, kann ein Browser (ich nehme mal den Firefox als Beispiel) Dateien aus dem Dateisystem laden (Datei öffnen) und auch speichern (Seite speichern unter oder Ziel speichern unter). Und natürlich gibt es die Cookies und ähnliche Speichermöglichkeiten (man denke an Flash). Und man kann natürlich auch einen Datei-Upload (lokale Datei nach Web-Server) durchführen. Meist wird der Benutzer in einen entsprechenden Dialog verwickelt bzw. muss von sich aus aktiv werden. Na ja, bei den Cookies usw. eher nicht. Aber das sind Antworten, die nicht wirklich spannend sind.

Die eigentlich interessantere Frage ist eher: "Gibt es per JavaScript eine Möglichkeit, auf lokale Dateien zuzugreifen?" Und natürlich ist die Antwort erst einmal "Nein", weil wir ja die Sicherheit des Browsers (Sandbox-Modell) unterstellen. Wäre die Antwort positiv, dann würden wir das als Fehler bzw. als Sicherheitsrisiko verstehen und darauf hoffen, dass jemand den Fehler behebt, damit der Zugriff unterbleibt, denn wir wollen (!) ja nicht, dass ein Web-Seitenaufruf Schaden auf dem lokalen PC anrichtet.

Allerdings gibt es manchmal Problemstellungen in speziellen Situationen, da würden wir gerne auf das lokale Dateisystem zugreifen, vielleicht, weil wir eine schöne JavaScript-Anwendung geschrieben haben, die sowieso nur lokal laufen soll oder nicht immer ein Web-Server zur Verfügung steht. Vielleicht auch, weil uns der Browser als User-Interface gefällt. In diesen Fällen gibt es Möglichkeiten, den Browser um entsprechende Zugriffs-Komponenten zu erweitern. Entweder wir laden unsere Anwendung statt mit dem http-Protokoll mit dem file-Protokoll, oder wir setzten bestimmte Datei-Endungen ein (.hta bei Microsoft, .xul bei Mozilla/Firefox) und werden beim (erstmaligen) Start gefragt, ob wir das Sicherheitsrisiko auch eingehen wollen. Manchmal kann man auch in den Browser-Einstellungen solches vereinbaren.

Im folgenden ein mit XPCOM-Komponenten angereichertes Java-Skript für den Firefox, welches in einer ganz normalen html-Datei stehen könnte:

<script>
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var file =
 Components.classes["@mozilla.org/file/local;1"]
 .createInstance(Components.interfaces.nsILocalFile);
file.initWithPath('C:\\example.txt');
var outputStream =
 Components.classes["@mozilla.org/network/file-output-stream;1"]
 .createInstance( Components.interfaces.nsIFileOutputStream );
outputStream.init(file, 0x04 | 0x08 | 0x20, 777, 0);
var output = 'hello world';
outputStream.write(output, output.length);
outputStream.close();
</script>

Kurze Erläuterung: Erwerb von Nutzungs-Privilegien, Schnittstelle zum lokalen Dateisystem herstellen, Dateizuordnung treffen, Ausgabe-Stream herstellen und auf die Datei binden und entsprechende Verarbeitungs-Einstellungen vornehmen (Zugriffsart: lesen/schreiben usw., Zugriffsrechte), den Ausgabetext in den Ausgabe-Stream stellen und das Ganze schreiben und schließen.

Konzept und Referenz findet man. Das knappe Code-Beispiel will nur das Zusammenspiel zeigen, weil das in anderen Darstellungen fehlt oder oft überladen ist. Das Skript läuft sowohl auf dem lokalen Server als auch mit dem Protokoll file:. Ähnliches gibt es auch für den Internet Explorer.

Zuletzt ein Anwendungsbeispiel eines lokal zu startenden Wikis, welches per AJAX auch noch den Up- bzw. Download zu einem Server demonstriert: TiddlyWiki.

2 Kommentare:

Anonym schreibt:

Wichtige Sache, wenn man von Funktionen spricht, die ohne Internetzugang per lokalem Server laufen sollen - danke für den Denkansatz.

Anonym schreibt:

Mh.. wenn ich das recht interpretiere kann man einfach so auf das lokale Dateisystem zugreifen und tun und lassen was man will?... Sehr böse, eigentlich. Solche Informationen helfen aber, die Sicherheit eines Systems zu erhöhen ;-).