conIT Gesellschaft für Consulting, Software-Entwicklung und IT-Dienstleistungen mbH conIT GmbH

JavaScript Considered Harmful

veröffentlicht:

“GOTO Considered Harmful” (sinng. etwa “die Sprunganweisung GOTO als schädlich betrachtet”) war ein bahnbrechender Artikel des Informatik-Pioniers Edsgar Dijkstra, der 1969 erschien und die strukturierte Programmierung begründete. Zugegeben – wir nehmen nicht an, daß dieser Beitrag ebenso bahnbrechend sein wird, und wird sicherlich auch bei der Mehrheit der Webnutzer auf Widerspruch oder zumindest Erstaunen stoßen, jedoch erscheint die Paraphrase des Titels ausgesprochen passend.

Was ist JavaScript?

JavaScript ist eine Programmiersprache, die in HTML-Seiten eingebettet werden kann. Mit diesen Programmteilen läßt sich die einfache Beschreibung des Seitenaufbaus um dynamische Abläufe und Reaktionen auf Anwenderereignisse ergänzen. Damit ist eine Webseite nicht länger nur ein Dokument, das wie auf Papier dargestellt wird, sondern sie wandelt sich zu einem Programm, das Aktionen durchführt.

Diese Technologie ist jedoch nicht ohne Risiken für den Besucher eines solchen Webauftritts. In diesem Artikel möchten wir diese Risiken darstellen und erläutern, weshalb wir bei unseren internetbasierten Anwendungen konsequent auf den Einsatz von JavaScript verzichten.

Warum überhaupt JavaScript?

Informationen im World Wide Web werden normalerweise in Dateien abgelegt, in der die Texte mit der Auszeichnungssprache HTML strukturiert sind. Diese Auszeichnungs- bzw. Seitenbeschreibungssprache markiert die einzelnen Bestandteile in dieser Datei nach ihrer Funktion, als Überschrift, Textabsatz oder beispielsweise Aufzählungspunkt, sorgt für das Einbinden von Bildern und anderen Elementen. Alle diese Angaben sind in Form von ganz normalem, lesbarem Text hinterlegt. Diese Steueranweisungen nennt man Tags. Über die Art der Bildschirmanzeige mit bunten Farben, unterschiedlichen Schriftgrößen und -arten sorgen die Betrachtungsprogramme, die auch in Deutschland als “Browser” bezeichnet werden, selbst anhand dieser Funktion des jeweiligen Textteiles. Bei modernen Webseiten werden die Gestaltungshinweise in Form von Style Sheets gegeben und steuern Größe, Farben, Umrandungen und die meisten anderen Darstellungsaspekte.

Dem HTML-Code fehlt nun völlig die Möglichkeit, die einmal gewählte Darstellung und Anzeige auf dem Bildschirm zu verändern oder äußeren Ereignissen anzupassen, sieht man von einigen neueren Funktionen in den Style Sheets ab, die z.B. Veränderungseffekte beim Überstreichen mit dem Mauszeiger ermöglichen. Der Browser ermittelt den Platz, den die einzelnen Elemente auf dem Bildschirm belegen, und ordnet alles nach den besten Möglichkeiten für die Anzeige auf dem Darstellungsmedium an. Es gibt keinerlei Wege, Anweisungsketten zu beschreiben (zuerst tue dies, anschließend das, dann …), was eine Voraussetzung für Programm- und Aktionsabläufe ist. Damit kann sich der Nutzer relativ sicher wähnen, daß nur die gewünschten Informationen dargestellt werden und keinerlei versteckte Aktivitäten im Hintergrund ablaufen.

Schon bald genügte der Firma Netscape diese statische Darbietung von Texten und Grafiken nicht mehr. Sie definierte eine Programmiersprache zur Formulierung von Routinen und Funktionen, die im Browser des Betrachters, also auf dessen Rechner, ausgeführt wurden. Mit diesen Funktionen können eine Reihe von Informationen über den Browser und das System des Benutzers abgefragt und als Reaktion darauf die Anzeige aktiv manipuliert werden. Der Betrachter vor dem Bildschirm merkt von diesen Manipulationen meistens nichts. Neben einigen sicherlich guten und sinnvollen Anwendungsfällen dieser Technologie gibt es eine Vielzahl von Risiken, die mit deren Einsatz untrennbar verbunden sind. Hieran haben leider in der Vergangenheit (und bis heute) viele der sogenannten “Webdesigner” mitgewirkt, die diese Technologie nur aus Profilierungssucht oder mangels besserem Wissen für alle möglichen billigen, meist überflüssigen Spielereien eingesetzt haben; vollkommen die Prämisse vergessend, daß die Möglichkeiten des Scriptings einen Webauftritt verbessern und ergänzen sollen. Per JavaScript animierte Verweise oder aufpoppende Fenster sehen zwar manchmal hübsch aus, entziehen dem Benutzer aber die Kontrolle über die Benutzungsoberfläche und schließen Suchmaschinen dazu noch wirkungsvoll aus.

Was ist denn nun so verwerflich?

Gegen den praktischen Einsatz von JavaScript in Webprojekten sprechen drei konkrete Punkte

JavaScript ist abschaltbar

Daß Sie als Benutzer bzw. Besucher einer Webseite JavaScript bewußt abschalten können, ist nun wirklich nicht das Kernproblem – ganz im Gegenteil: jedes Feature ist ein Bug, wenn es nicht abschaltbar ist. Die Abschaltbarkeit von JavaScript ist sogar die einzig wirksame Maßnahme, um alle im folgenden noch beschriebenen Probleme zu beseitigen, und wir empfehlen dies auch dringend.

Wenn sich aber jeder Nutzer individuell entscheiden kann, JavaScript zu deaktivieren, kann sich ein Ersteller von Webanwendungen nicht auf dessen Verfügbarkeit verlassen. Damit die Anwendung weiterhin nutzbar bleibt, muß der Entwickler eine Lösung realisieren, die auch ohne den Einsatz von Scripting auskommt. Nutzt beispielsweise ein Formular auf einer Webseite JavaScript, um die Benutzereingaben auf Korrektheit und Vollständigkeit zu prüfen, so muß dies die Anwendung auf dem Server trotzdem nochmals verifizieren, da die Prüfung ohne das Scripting nicht stattgefunden hat. Die Alternative ist, die Nutzung ohne Scripting zu verhindern, aber damit sperrt der Seitenentwickler die sicherheitsbewußten Besucher aus, welche JavaScript und dessen Verwandtschaft ausdrücklich deaktiviert haben. Und normalerweise haben Webdesigner die Aufgabe, eine Seite so attraktiv zu gestalten, daß sie möglichst viele Besucher anzieht und nicht aussperrt. In dieser Konstellation helfen auch keine Beteuerungen wie “Diese Seite erfordert JavaScript, bitte einschalten!”, meist verbunden mit einer ellenlangen Anleitung, wie sich dies in -zig verschiedenen Browsern realisieren läßt.

Alle modernen Browser werden per Voreinstellung mit aktiviertem JavaScript ausgeliefert. Kommen Sie als Besucher mit ausgeschaltetem Scripting auf eine Webseite, so können deren Entwickler davon ausgehen, daß Sie bzw. die Administratoren in Ihrem Firmennetzwerk diese Einstellung ausdrücklich und im Bewußtsein der Risiken so vorgenommen haben. Ein solchermaßen informierter Nutzer wird JavaScript nicht ohne plausible Begründung aktivieren, welche Funktionalitäten mangels Alternativen mit Scripting realisiert sind und auf welche Vorteile er ohne JavaScript verzichten muß. Die mündigen Netzbenutzer wissen dann auch selbst, wie sie Scripting wieder aktivieren können, wenn sie das Risiko abschätzen können und die Notwendigkeit des Einsatzes einsehen.

Bei alternativlosem Einsatz von JavaScript bleiben aber auf jeden Fall diejenigen Besucher auf der Strecke, die keinen Zugriff auf die Einstellungsmöglichkeiten ihres Browsers haben, weil deren Administratoren die Einstellungen vornehmen oder ein zentraler Proxy die potentiell risikoreichen Inhalte herausfiltert. Daher gibt es ohnehin keine Alternative zu einer script- und damit barrierefreien Gestaltung eines Webauftritts, möchte man auf keinen Besucher und damit potentiellen Kunden verzichten! Eine Internet-Präsenz ist eine Bringschuld, keine Holschuld. Für einen Besucher bieten sich Alternativen in der Regel nur wenige Mausklicks entfernt!

Fazit: die besten Webauftritte sind die, bei denen der Besucher gar nicht merkt, ob Scripting im Spiel ist, weil sich mit oder ohne dieses alle Elemente bedienen und nutzen lassen. Dem risikofreudigen Nutzer kann der Ersteller der Seite per Scripting gerne alle vorstellbaren Zusatzfunktionen anbieten, die über die reine Informationsdarbietung hinausgehen. Vermeiden Sie als Webautor auf alle Fälle die penetranten Hinweise “diese Seite erfordert JavaScript, bitte einschalten!”. Besser wäre eine kleine, unaufdringliche Einblendung: “Sie haben JavaScript deaktiviert. Auf dieser Seite bietet Ihne aktiviertes Scripting folgende Vorteile: …”, verbunden mit einer Aufzählung der dadurch erreichbaren Verbesserungen in den Bedienfunktionen der Seite.

JavaScript ermöglicht Belästigungen

Betrifft die Abschaltbarkeit von JavaScript noch vordringlich die Ersteller des Webauftritts, so wirken sich die möglichen Belästigungen direkt beim Besucher der Seite aus.

JavaScript ermöglicht u.a., mit oder ohne Interaktion des Nutzers eine beliebige Anzahl von Fenstern zu öffnen, das Verlassen einer Webseite zu erschweren oder unmöglich zu machen, normalerweise automatisch erzeugte Hinweistexte zu manipulieren, dargestellte Elemente auf den Seiten in Größe, Erscheinungsbild und Position zu verändern. Diese Möglichkeiten führen nicht zu direkten Gefährdungen auf dem Rechner des Betrachters, sind aber äußerst lästig und können doch bis zu Einschränkungen in der Nutzbarkeit des gesamten Rechners oder zumindest der Browseranwendung führen.

Diese Probleme haben auch die Browserhersteller erkannt, jedenfalls die meisten. Sie bieten in ihren Produkten entweder direkt oder über Erweiterungsmodule an, JavaScript-Funktionalitäten zu unterbinden, die solche Aktionen ermöglichen. Nur ist das wieder eine Lösung der Form “wir beseitigen Probleme, die wir ohne gar nicht erst hätten”. Vielfach werden die Einsatzmöglichkeiten von JavaScript für belästigende Effekte erst im Laufe der Zeit entdeckt, so daß hier ständig nachgebessert werden muß.

JavaScript öffnet Einfallstore für echte Schädlinge

In der Theorie gehen von JavaScript eigentlich keine unmittelbaren Gefahren und Risiken aus. Es gibt keine Befehle, die direkt auf lokale Daten auf Speichermedien des Nutzerrechners oder auf Netzwerkverbindungen zugreifen können. Leider sieht die Praxis anders aus: Nahezu alle Sicherheitslücken von Browsern der letzten Jahre standen, auch und insbesondere bei den aktuellsten, leistungsfähigsten Vertretern, mit JavaScript in Verbindung. In der absoluten Mehrzahl aller bekannten Fälle lautete der gutgemeinte und korrekte Rat, JavaScript bis zur Verfügbarkeit einer Problemkorrektur für den entsprechenden Browser zu deaktivieren (sic! – da war sie wieder, unsere generelle Empfehlung).

Inhalte und Statusanzeigen im Browser können durch JavaScript manipuliert werden und verschleiern so ihre wahre Natur auch für aufmerksame und vorsichtige Seitenbesucher. Überstreichen Sie bei einem grafischen Browser beispielsweise mit dem Mauszeiger einen Verweis (“Link”), so erscheint dessen Zieladresse in der Statuszeile. Für einen sicherheitsbewußten WWW-Besucher ist dies eine unerläßliche Funktion; kontrolliert er hier doch, ob das Verweisziel auch tatsächlich dasjenige ist, welches der Verweistext verspricht, und welche Reaktion beim Betätigen dieses Verweises im Browser zu erwarten ist. Viele Schadprogramme, die sog. Trojanischen Pferde, machen sich zunutze, daß dem Besucher etwas anderes untergeschoben wird, als er eigentlich erwartet.

JavaScript ermöglicht nun, diese Statusanzeige des Verweisziels entweder zu unterdrücken oder zu verändern. Damit wird diese sicherheitsrelevante Funktionalität komplett nutzlos, und disqualifiziert schon dadurch den Einsatz von JavaScript für den alltäglichen Betrieb. Der Nutzer kann der Anzeige seines Programmes nicht mehr vertrauen. Auch dieses Problem haben die meisten seriösen Browser-Hersteller erkannt und bieten per eingebauter Konfiguration oder Erweiterungsmodul die Möglichkeit, speziell solche Funktionen von JavaScript totzulegen, aber… siehe oben: wir lösen ein Problem, das wir ohne überhaupt nicht hätten. Denn wozu noch JavaScript, wenn wir doch wieder alles deaktivieren?

Echte Gefahren gehen auch von fehlerhaften Realisierungen derjenigen Programmteile der Browser aus, die den JavaScript-Code ausführen, den Interpretern. Hier werden immer wieder Lücken und Fehler entdeckt, bei denen schon der reine Besuch einer Webseite und die Darstellung auf dem Bildschirm genügen, um schädliche Funktionen, Datenklau, Zerstörung von Daten auf dem Besucherrechner durchzuführen. Die theoretische Schutzfunktion, daß Datei- und Netzwerkzugriffe nicht möglich sind, werden durch Ausnutzung dieser Fehler ausgehebelt.

Eine der gravierendsten Gefahren bei der Nutzung von Scripting sind die sogenannten Cross Site Scripting Angriffe, abgekürzt XSS. Es ist ja nicht so, daß sich die Browserhersteller und die JavaScript standardisierende Organisation ECMA sich gar keine Gedanken über Sicherheit gemacht hätten. So sind generelle Netzwerkzugriffe unterbunden; per JavaScript läßt sich aber auf die bestehende Netzverbindung zu der Internetpräsenz zugreifen, von der aus das Script geladen wurde.

Es sind nun in der Vergangenheit einige Möglichkeiten bekanntgeworden, wie sich diese Kontrollen durch einen Angreifer geschickt aushebeln lassen, so daß fremder JavaScript-Code im Kontext anderer Seiten ausgeführt wird oder auf die Daten anderer Seiten zugreifen kann. Hierbei sind in der Regel mehrere Browserfenster im Einsatz, die sich geschickt überdecken und so auch aufmerksame Benutzer über die wahre Natur der ausgetauschten oder angezeigten Daten täuschen können. Damit können vertrauliche Daten abgefangen werden, wie dies bei den zur Zeit populären Phishing-Angriffen passiert, oder es lassen sich direkt Daten von anderen Seiten abfangen.

Unter diesen Risiken sollte JavaScript insbesondere auf Seiten mit finanziellen Transaktionen, zum Beispiel beim Homebanking, grundsätzlich ausgeschaltet sein. Bei solchen Aktivitäten mit sensiblen Informationen ist einfach die Gefahr zu groß, daß diese aufgrund von Programmfehlern oder sogar nur aufgrund von Unachtsamkeit in die falschen Hände gelangen und zu direkten, finanziellen Schäden führen.

Ohne JavaScript sind aber die meisten Webseiten unbenutzbar!

Diese Beobachtung teilen wir voll und ganz!

Viele Webseiten sind leider so gestaltet, daß sie ohne aktiviertes JavaScript nicht bedienbar sind. Das Haupt-Navigationsmenü ist per Scripting animiert, Verweisziele (Links) werden mit JavaScript zusammengesetzt, neue Fenster in bestimmten Dimensionen geöffnet und allerhand Effekte, die allesamt nett anzusehen sind, aber weder für die Funktionalität noch für eine klare, benutzerbestimmte Bedienung erforderlich sind.

Aber nochmals: Eine Webseite ist eine Bringschuld, keine Holschuld. Niemand kann Sie zum Besuch eines bestimmten Webauftritts zwingen. Es ist nicht Ihre Aufgabe als Besucher, mit allerhand Klimmzügen sich den Zugang zu verschaffen, sondern der Betreiber hat Ihnen den Weg zu ebnen. Leider herrscht hier noch bei vielen Webdesignern die Ansicht, je bunter oder verspielter ein Auftritt ist, um so besser ist er. Teurer wird er auf jeden Fall in der Erstellung, aber auch dadurch, daß zahlreiche Besucher durch diese Bedienhemmnisse verschreckt und vertrieben werden. Ganz abgesehen von den Suchmaschinen, deren Erfassungsprogramme (Spider) von JavaScript und ähnlichen Spielereien komplett ausgesperrt werden.

Als Beispiel aus dem praktischen Leben: wenn Sie ein Ladengeschäft betreten, wollen Sie einfach durch die Tür hereinkommen und Ihre Besorgungen erledigen. Das Geschäft hätten Sie sicherlich zum letzten Mal aufgesucht, falls Sie einen Laden nur mit Kleidung einer bestimmten Marke betreten dürften, eine Leiter zum Überwinden der Türschwelle brauchen im Inneren ständig mit der Aktivierung der Sprinkleranlage rechnen müßten. Nicht anders ist es bei einem Webauftritt. Sie haben ihr Internet-Betrachtungsprogramm für alle absehbaren Fälle sicher konfiguriert, wollen eine Seite besuchen und werden nun erst einmal aufgefordert, alle möglichen Einstellungen und Anpassungen vorzunehmen. Wieso ziehen die meisten Leute hier auf einmal um und greifen zur Leiter?

Schließlich gelangen Sie im Internet noch viel schneller zum “Laden nebenan” als im richtigen Leben: die nächste Alternative ist nur wenige Mausklicks entfernt.