Aktive Inhalte im Web - ein Überblick
Am Mittwoch, den 24.04.2002 ging es beim turnusmäßigen Termin des HITFORUMS Rhein/Ruhr in Herten um "Aktive Inhalte im Web". Diese Seite fasst die Themen des Abends zusammen und wird ständig inhaltlich erweitert - Aktuelle Version 1.15.
Hinweise, Fragen, Korrekturen, Beispiel, Beiträge, Tipps und Links sind immer herzlich willkommen! Bitte hier melden!
Überblick
Clientseitige Dynamik
JavaScript (browserabhängig!)
JScript (nur Microsoft)
VBscript (nur Microsoft)
ECMA-Script (standardisiert)
Document Object Model (DOM) (standardisiert)
Beispiel JavaScript
Browsererweiterungen
Plugins
Java-Applets
ActiveX
Exkurs: Technische Grundlagen HTTP
Request - Anfrage: Browser an Webserver
Response - Antwort: Webserver an Browser
Sessions
Cookies
Cookie - Testskript
Exkurs: Formulare in HTML
GET - Parameterübergabe in der URL
POST - Parameterübergabe im HTTP-Header
Beispielprogramm
Serverseitige Dynamik
Technischer Ablauf bei serverseitiger Dynamik
CGI - Common Gateway Interface
Perl (*.pl, über CGI oder in HTTPD eingebunden)
Exkurs: Environment Variablen
SSI (*.shtml, Server Side Includes)
PHP (*.php, *.php3, *.php4, *.phtml)
JSP (*.jsp, Java Server Pages)
ASP (*.asp, Active Server Pages, nur Microsoft IIS)
Cold Fusion (*.cfm, Cold Fusion Markup Language)
Application Server
Sicherheitsaspekte
Links zum Thema
Clientseitige Techniken
Ein erste grobe Unterteilung kann danach vorgenommen werden, auf welcher Seite im Client-Server-Modell die Dynamik angesiedelt ist. Auf der Seite des Clients kommen Skriptsprachen wie JavaScript oder Browsererweiterungen, wie Plugins, Java Virtual Machines und ActiveX zum Einsatz. Im folgenden betrachten wir diese Techniken näher, später werfen wir dann einen Blick auf die serverseitigen Techniken.
[zurück zur Übersicht]
JavaScript
JavaScript ist eine Erweiterung des Browsers und wird direkt vom Browser interpretiert und ausgeführt.
JavaScript 1.0 wurde von Netscape mit dem Navigator 2.0 in die Welt gesetzt und seitdem ständig weiterentwickelt, es folgten die Versionen 1.1, 1.2, 1.3 und jetzt neu 1.5.
JavaScript erlaubt solche Dinge wie Laufschriften, Texte als Programmausgabe, Farbänderungen, Menüs, Dialogboxen, Reaktionen auf Mausbewegungen, das Öffnen und Schliessen von Browserfenstern (Popup), aber auch die lokale Überprüfung von Formulareingaben bevor diese an den Server geschickt werden.
Dadurch dass es mittlerweile die verschiedensten Versionen von JavaScript gibt und zusätzlich noch JScript von Microsoft, ist es für den Webdesigner nicht ganz einfach, alle Browser korrekt zu unterstützen. So muss häufig der Typ (Netscape, Opera, Internet Explorer) und die Version des Browsers ermittelt werden, um dann mit jeweils spezifischen Codezeilen zu agieren.
Genau genommen hat JavaScript eigentlich nichts mit der Sprache Java zu tun, es nutzt lediglich eine Java-ähnliche Syntax. Tatsächlich wollte Netscape JavaScript ursprünglich Livescript nennen. Erst in letzter Minute wurde in Abstimmung mit Sun der marketingmäßig vorteilhaftere Name JavaScript gewählt.
Übrigens ist JavaScript von Netscape nicht allein für den Client-seitigen Einsatz erdacht worden. Bei Webservern von Netscape kann JavaScript auch serverseitig als Skriptsprache eingesetzt werden
(http://developer.netscape.com/docs/manuals/js/server/jsguide/jsserv.htm).
Etwas weiter unten findet sich ein kleines JavaScript-Beispiel mit Quellcode und Erläuterungen.
Weitere Informationen zu JavaScript gibt es hier:
SELFHTML Link-Verzeichnis JavaScript und DOM: http://aktuell.de.selfhtml.org/links/javascript.htm
JavaScript-Workshop bei Lycos: www.tripod.lycos.de/webmaster/topics/technic/javascript/
JavaScript Guidelines and Best Practice: http://tech.irt.org/articles/js169/
Ein historischer Überblick zur Entwicklung von JavaScript:
www.mintert.com/JavaScript/
All about JavaScript:
developer.netscape.com/viewsource/husted_js/husted_js.html
JavaScript Documentation
developer.netscape.com/docs/manuals/javascript.html
JavaScript Newsgroup FAQ:
developer.netscape.com/support/faqs/champions/javascript.html
Nähere Infos zu JavaScript
http://service.t-online.de/t-on/hilf/sich/akti/ar/CP/ar-javascript.html
[zurück zur Übersicht]
JScript, VBscript
Bei JScript und VBscript handelt es sich um Microsoft-spezifische Skriptsprachen, die demzufolge auch nur vom Internet Explorer unterstützt werden. JScript ist die MS-Variante von JavaScript und seit der ersten Version des Internet Explorers (das war die Version 3.0) auf dem Markt. Gleichzeitig hat Microsoft auch noch VBscript herausgebracht, das auf Visual Basic basiert.
Link:
http://msdn.microsoft.com/scripting/jscript/
[zurück zur Übersicht]
ECMA-Script
Bei ECMA-Script handelt es sich nicht tatsächlich um eine weitere Scriptsprache, sondern vielmehr um den Versuch per Standardisierung einen verbindlichen Funktionsumfang für Scriptsprachen festzulegen. ECMA-Script orientiert sich an JavaScript, ist aber damit nicht identisch. Sowohl Netscape als auch Microsoft haben ihre Sprachen im Lauf der Zeit dem ECMA-Standard angepasst, bringen aber immer noch darüber hinausgehende Erweiterungen.
Näheres zu ECMA-Script findet sich unter www.ecma.ch.
[zurück zur Übersicht]
Document Object Model (DOM)
Die Standardisierung durch die ECMA regelt zwar den Sprachumfang der Skriptsprache , hiermit ist aber noch nicht festgelegt, wie Browser und Skriptsprache interagieren können, wie also per Skript auf die Elemente des darzustellenden Dokuments zugegriffen werden kann.
Viele der anfänglichen Probleme mit JavaScript resultieren daher, dass hier jeder Browser seinem eigenen Modell folgte. Mit dem Document Object Model (DOM) des w3.org gibt es mittlerweile aber einen Standard, der von den neuesten Browsern auch unterstützt wird.
Näheres zu DOM findet sich unter www.w3.org/TR/REC-DOM-Level-1.
[zurück zur Übersicht]
Beispiel JavaScript
Ein Beispiel für den Einsatz von JavaScript findet sich hier.
Der Sourcecode des Beispiels:
<script language="JavaScript">
<!--
do { var a = prompt("Bitte die erste Zahl eingeben!","");
var b = prompt("Bitte die zweite Zahl eingeben!","");
var c = a*1+b*1;
document.write("<p>",a," + ",b," = ",c,"</p>");
}
while (c!=0);
-->
</script>
<noscript>
<p><b>Sorry, Ihr Browser unterstützt kein JavaScript.
Daher läuft das Beispiel leider nicht!</p>
</noscript>
Erläuterung
Das eigentliche Skript steht zwischen den Tags <script> und </script>.
Generell ignorieren Browser alle Tags, die sie nicht kennen und versuchen den zwischen den Tags stehenden Text anzuzeigen. Um nun zu verhindern, dass ältere Browser den Skriptcode anzeigen, statt ihn auszuführen, ist der JavaScript-Code als HTML-Kommentar gekennzeichnet, also zwischen <!-- und --> gesetzt worden. Neuere Browser brauchen diese Hilfe nicht mehr, daher wird es zunehmend unüblicher sie einzusetzen.
Unter XHTML 1.0 führt das Einkommentieren sogar zu einem Problem, da unter XML alle Kommentare vom Browser vorab verworfen werden - unabhängig davon, wo sie stehen. Das Einkommentieren führt bei XHTML 1.0 also zu einem leeren Skript-Tag. Ein Ausweg um sowohl XHTML- als auch Altbrowser-kompatibel zu bleiben ist nur das Auslagern des Skript-Codes in eine eigene Datei.
Zwischen den Tags <noscript> und </noscript> steht der Text, der von Browsern angezeigt werden soll, die entweder kein JavaScript kennen oder bei denen es abgeschaltet worden ist.
Egal ob der Browser die Tags nun kennt oder nicht, er wird den Inhalt zwischen den Tags anzeigen. Lediglich bei aktiviertem JavaScript wird nun wiederum alles zwischen den Tags übergangen.
Übrigens, mal ehrlich, wem ist die seltsame Zeile var c = a*1+b*1; aufgefallen??? Nun, wenn man stattdessen einfach var c = a+b; schreiben würde, dann würden die beiden Zahlen nicht addiert, sondern die beiden eingegebenen Strings einfach zusammengesetzt. JavaScript kennt nämlich keine expliziten Datentypen, alles sind erstmal Strings. Das ist einerseits genial einfach, bei speziellen Gelegenheiten wie hier aber auch extrem lästig. Der Operator "+" auf Strings angewendet bedeutet nämlich, dass sie miteinander verkettet werden ("concatenation"). Erst wenn wir durch irgendwelche Maßnahmen klarstellen, dass hier Zahlen gemeint sind, wird das "+" als Addition erkannt. In unserem Beispiel zu HTML-Formularen gibt es dasselbe Problem und eine ähnlich sinnige Lösung :-) .
[zurück zur Übersicht]
Plugins
Clientseitig kommen häufig auch noch sogenannten Plugins zum Einsatz. Das sind installierbare Erweiterungen des Browsers, die spezielle Dateiformate unterstützen und so beipielweise Multimedia-Anmimation oder ähnliches ausführen. Bekanntester Vertreter dieser Kategorie dürfte der "Flash"-Plugin sein.
<FLAME>Dieser ist bei manchen Designer so beliebt, dass sie am liebsten gar niemanden mehr auf ihre Seiten lassen wollen, der nicht über die jeweils neueste Version verfügt. Manche sind immerhin so generös, dass sie es gestatten, ihre Kunstwerke zu ignorieren ("Skip Intro"). Andere sind da weniger einfühlsam. Da heisst es entweder Plugin installieren oder draussen bleiben.</FLAME>
Macromedia Flash: http://www.macromedia.com/software/flash/
[zurück zur Übersicht]
Java-Applets
Bei Java-Applets handelt es sich um "richtige" Java-Programme, die speziell so erstellt worden sind, dass sie vom Browser in seiner eigenen Java Virtual Machine (VM) ausgeführt werden können. Hiermit sind auf dem Client weitestgehend alle Dinge möglich, die eine vollwertige Programmiersprache eben bietet.
Der Browser lädt das Applet vom Server, was je nach Größe des Applets durchaus einige Zeit in Anspruch nehmen kann ("applet loading"). Bei späteren Aufrufen ist eine erneuter Download nicht mehr notwendig.
Java-Applets laufen in einer gekapselter Umgebung ("Sandbox"), was ihre Möglichkeiten aus Sicherheitsgründen stark einschränkt. Wenn der Anwender es aber möchte, kann er diese Einschränkungen aufheben, um dem Applet auch weitergehende Möglichkeiten einzuräumen (Zugriff auf das Dateisystem, etc.).
Grundsätzlich ist die Ausführung eines fremden Programms auf dem eigenen Rechner immer ein potentielles Sicherheitsrisko, da die geplanten Schutzmaßnahmen immer wieder Lücken aufweisen.
Applets werden unter anderem gerne beim Homebanking eingesetzt. Hier stellt die Bank das entsprechende Applet zum Downlaod zur Verfügung, das dann clientseitig z.B. auf einen Kartenleser und die eingelegte Chipkarte zugreifen kann (HBCI).
Java wird ständig weiter entwickelt. Entsprechend gibt es auch verschiedene Versionsstände. Nicht jeder Browser hat aber unbedingt schon die passende VM. Hieraus können Probleme resultieren.
Ansonsten sind Applets, genau wie Java selber, schon eine geniale Idee. Ein Java-Applet kann normalerweise genauso gut auf einem Windows-PC, auf einem Mac oder unter Unix ausgeführt werden. Es ist unabhängig vom darunterliegenden Betriebssystem.
Nähere Infos zu Java
http://service.t-online.de/t-on/hilf/sich/akti/star/CP/ar-java.html
[zurück zur Übersicht]
ActiveX
Deshalb gibt es bei Microsoft "ActiveX". Hier wird ebenfalls Code vom Server zum Client heruntergeladen. Allerdings werden hierbei nur Clients mit einem Windows-Betriebssystem unterstützt. Unix, Macs und dergleichen müssen leider draussen bleiben.
Dadurch dass ActiveX sozusagen immer ein Heimspiel hat, also auf einem Windows-System ausgeführt wird, kann es mit speziellen Funktionen glänzen, die bei Applets nicht so einfach und elegant möglich sind.
Diesen Vorteil erkauft man sich aber mit einer verschärften Sicherheitslage! ActiveX läuft nicht in einer "Sandbox"! Das ActiveX-Programm läuft mit allen Rechten des angemeldeten Benutzers ohne jede Einschränkung!
Das Sicherheitsmodell von Microsoft setzt stattdessen auf zertifikatsbasiertes Vertrauen. Das ActiveX-Programm präsentiert ein Zertifikat und der Anwender muss (im Einzelfall oder grundsätzlich) entscheiden, ob er der Software vertraut.
Diese Zertifikate beziehen sich nicht, wie man vielleicht irrtümlich annehmen könnte, auf das jeweils vorliegende Softwareprodukt. Die Software selber ist von niemandem ausser (hoffentlich zumindest) vom Hersteller auf Sicherheitslücken oder gar Schadroutinen untersucht worden.
Das Zertifikat besagt lediglich, dass der Hersteller dieser Software die Firma XYZ ist und das Programm nicht zwischenzeitlich von anderen verändert worden ist. Genau genommen sagt das Zertifikat sogar nur aus, dass der Aussteller des Zertifikats von der Identität des Softwareherstellers überzeugt ist, mehr nicht.
Wie er zu dieser Überzeugung gekommen ist, ist unklar, da müssen wir ihm schon vertrauen. Peinlicherweise ist es der Firma Verisign (einem der wirklich namhaften Zertifikatsanbieter) passiert, dass sie jemandem fälschlicherweise Zertifikate ausgestellt hat, die ihn als "Microsoft" ausgewiesen haben. Da dummerweise in dem ganzen Überprüfungsmechanismus von Microsoft keine online Gültigkeitsprüfung der Zertifikate vorgesehen ist (d.h. es gibt keine "CRL" Certificate Revocation List, Liste der zurückgezogenen Zertifikate) musste Microsoft eine ganze Reihe von Patches für die verschiedensten Windows-Betriebssysteme herausbringen, die nun (sofern installiert) dafür sorgen, dass genau diese Zertifikate herausgefiltert werden!
Durch das Zertifikat wissen wir also, von wem die Software (wahrscheinlich) stammt. Dann müssen wir uns entscheiden, ob wir Software aus dieser Quelle vertrauen. Läuft das ActiveX-Programm erst einmal, dann ist sein Funktionsumfang in keiner Weise eingeschränkt oder wenigstens kontrollierbar. Auch auf die Gefahr hin, zu langweilen: Das Zertifikat sagt nichts über die Software selber aus.
Nähere Infos zu ActiveX
http://service.t-online.de/t-on/hilf/sich/akti/ar/CP/ar-activex.html
[zurück zur Übersicht]
Zusammenfassung clientseitige Dynamik
Allen bisher erwähnten Techniken ist gemeinsam, dass sie clientseitig, also auf dem Rechner des Websurfers in dessen Browser oder in einer Erweiterung davon ausgeführt werden. Hierzu wird der aktive Code zusammen mit der HTML-Seite vom Server an den Client übertragen und dort vom Webbrowser, der Java-Umgebung (VM) oder einem Plugin interpretiert.
Da die Ausführung clientseitig erfolgt, treten hier gegebenenfalls auch alle Sicherheitsprobleme auf. Serverseitig werden keinerlei Ressourcen benötigt, Diese Art von Dynamik kann auch mit einer minimalen Webpräsenz ("Webvisitenkarte") genutzt werden.
[zurück zur Übersicht]
Serverseitige Dynamik
Clientseitige Skripte bieten ganz nette Möglichkeiten, um Webseiten aufzupeppen. Wirklich ernsthafte Anwendungen benötigen aber serverseitige Unterstützung.
Wer eifrig durch das Web surft und dabei ab und zu einen Blick auf die URL-Anzeige des eigenen Browsers wirft, wird dort eine Vielzahl von Dateiendungen entdecken.
Hier gibt es nicht nur die gewohnten html- oder htm-Dateien, sondern beispielsweise auch die folgende Extensions:
asp, jsp, php, phtml, shtml, pl, cfm, ...
Manche URLs haben auch "kryptische" Anhänge der folgenden Art:
http://www.hitforum.de/demo.php?num1=333&num2=555
Dies sind typische Kennzeichen für die Nutzung dynamisierter Webseiten.
Bei serverseitiger Dynamik werden die Anfragen (HTTP-Requests) des Browser nicht einfach dadurch beantwortet, dass eine auf dem Web-Server vorhandene HTML-Datei unverändert zurückgeliefert wird. Vielmehr wird die Ausgabe stets neu erzeugt und beispielsweise aus statischen und dynamischen Anteilen zusammengesetzt.
So ist es möglich, dass vom Benutzer ausgefüllte Formulare auf dem Server ausgewertet werden können. Keine Suchmaschine könnte ohne diese Funktionalität ihre Dienste anbieten.
Oder aber Besucher einer Website können sich per Login anmelden und werden mit "personalisierten" Webseiten beglückt und gegebenenfalls beim nächsten Besuch anhand von Cookies wieder erkannt.
Ein wichtiges Anwendungsgebiet sind datenbankbasierte Webseiten. Online-Shops beispielsweise nutzen diese Techniken um Produkte, Infos, Preise und Verfügbarkeiten aus Datenbanken einzulesen und in dynamisch generierten Webseiten anzuzeigen. Und sie speichern Kundendaten und Bestellungen (Warenkörbe) in Datenbanken.
Bevor wir uns nun den einzelnen serverseitigen Techniken zuwenden, werfen wir erst mal einen Blick auf die technischen Grundlagen: HTTP und Formulare in HTML.
[zurück zur Übersicht]
Exkurs: Technische Grundlagen - HTTP
Der Zugriff eines Browsers auf einen Webserver erfolgt über das "Hypertext Transfer Protocol". Die aktuelle Version 1.1. ist im "RFC 2616" beschrieben:
http://www.ietf.org/rfc/rfc2616.txt
http://www.faqs.org/rfcs/rfc2616.html
http://www.w3.org/Protocols/rfc2616/rfc2616.html
Das Protokoll HTTP bildet zusammen mit dem HTML-Format die Grundlage des uns bekannten World Wide Web. Da sich das WWW aber anscheinend anders entwickelt hat, als ursprünglich mal angedacht, kann HTTP einerseits mehr als uns lieb ist, hat aber andererseits auch eklatante Schwächen.
Werfen wir also einen Blick auf die Arbeitsweise von HTTP.
HTTP-Request
Der Webbrowser stellt eine Anfrage an den Webserver, einen sogenannten "HTTP-Request". HTTP ist (wie viele Internet-Protokolle) ein textbasiertes Protokoll. Das heisst, mit geeigneten technischen Hilfsmitteln kann man den Datenverkehr beobachten und im Klartext mitlesen. Eine typische (allerdings für unserer Zwecke stark vereinfachte) Anfrage eines Browser an einen Webserver könnte wir folgt aussehen:
GET /demo.php HTTP/1.0
Host: www.hitforum.de |
In der ersten Zeile teilt der Browser mit, dass er vom Server gerne die Datei "/demo.php" abrufen möchte. Die zweite Zeile mit der Host-Angabe ist immer dann notwendig, wenn es sich bei der Webpräsenz um einen virtuellen Webserver handelt, sich also viele solche Webpräsenzen einen Rechner und dessen IP-Adresse teilen. Anhand des HOST-Eintrags weiss der Server dann, welche Präsenz gemeint ist. Mit dem Kommando "GET" können Dokumente beliebigen Typs (HTML, Audio, Bilder, ...) von einem Webserver abgerufen werden.
Wenn der HTTP-Zugriff über einen Proxy erfolgt, dann schickt der Browser auch die Angaben zu Protokoll und Host in der GET-Zeile mit. Der Proxy selber wiederum wendet sich dann wie oben geschildert an den Host:
GET http://www.hitforum.de/demo.php HTTP/1.0
Host: www.hitforum.de |
Neben "GET" gibt es noch eine Reihe weiterer Befehle. So können mit "HEAD" verwaltungstechnische Infos (Größe in Bytes, Datum der letzten Änderung) zum angegebenen Dokument angefordert werden, ohne dass das Dokument selber dabei mitgeschickt wird. So kann der Browser z.B. feststellen, ob sich das gewünschte Dokument gegenüber dem letzten Zugriff überhaupt geändert hat. Ist dies nicht der Fall, kann eine eventuell aufwendige Neuübertragung vermieden werden, indem einfach die beim letzten Zugriff zwischengespeicherte Version aus dem "Cache" genommen wird.
Mit "POST" können Daten an den Server geschickt werden, z.B. Feldinhalte aus einem ausgefüllten Formular oder Dateianhänge beim E-Mail-Versand per Web.
Mit "PUT" können (theoretisch) Dokumente auf den Server hochgeladen oder mit "DELETE" dort gelöscht werden. Die letzten beiden Befehle dürften allerdings bei den meisten ordentlich verwalteten Webservern nicht so ohne weiteres möglich sein :-) .
Weitere hier nicht näher zu beleuchtende HTTP Kommandos sind "TRACE", "OPTIONS" und "CONNECT". Für nähere Informationen sei nochmals auf die RFC 2616 verwiesen.
HTTP-Response
Normalerweise antwortet der Server auf einen HTTP-Request mit einer sogenannten HTTP-Response (hier ebenfalls wieder stark vereinfacht):
Content-type: text/html
<HTML><BODY><H1>Hello World!</h1></BODY></HTML> |
Eine HTTP-Response besteht prinzipiell aus einer oder mehreren sogenannten Headerzeilen, einer trennenden Leerzeile und den zu übertragenden Daten, also dem HTML-Code, Grafikdatei, etc..
In der Headerzeile unseres Beispiels teilt der Server mit, dass der nachfolgende Inhalt eine HTML-Datei ist: "Content-type: text/html". Diese Typ-Angaben sind die auch schon von der E-Mail her bekannten MIME-Types (siehe "E-Mail inside").
Nach der trennenden Leerzeile folgt dann unser kleiner HTML-Gruß an die Welt.
Wie bereits angedeutet, hat HTTP (jedenfalls bei bestimmten Anwendungen) neben seinen Stärken auch Schwächen. HTTP ist nämlich ein "statusloses" Protokoll.
Das heisst in etwa, dass jeder HTTP-Zugriff für sich allein steht. Bei HTTP Version 1.0 erfolgt jeder einzelne Abruf in einer eigenenen jeweils auf- und wieder abzubauenden TCP/IP-Verbindung. Besteht eine Webseite nun aber nicht nur aus einem HTML-Dokument, sondern hat auch noch z.B. dreissig eingebettete Bildchen (GIFs), so sieht man deutlich, dass es nicht ganz optimal sein kann, die Verbindung stets ab- und unmittelbar darauf wieder aufzubauen. Mit HTTP Version 1.1 wird die TCP/IP-Verbindung daher aus Effizienzgründen für mehrere nacheinander erfolgende Zugriffe genutzt und nach dem letzten Abruf einer Folge wieder geschlossen.
(Für Puristen und Besserwisser: der geschilderte Unterschied zwischen HTTP 1.0 und 1.1. betrifft natürlich erstmal nur das Default-Verhalten. Sowohl bei HTTP 1.0 als auch bei HTTP 1.1 kann das jeweils andere Verhalten durch die Direktiven "connection: keep-alive" bzw. "connection: close" erzwungen werden.)
Während die Steuerung des Auf- und Abbaus von TCP/IP-Verbindungen allenfalls geeignet ist, die Performance zu verbessern, ist hiermit aber noch nicht erreicht, dass der Webserver die verschiedenen Zugriffen eines bestimmten Benutzers von denen anderer Benutzer unterscheiden kann.
Auch die IP-Adresse des Kommunikationspartners ist hierfür nicht geeignet. Es könnte sich ja beispielsweise um den Proxy-Server einer großen Firma oder eines Providers handeln, über den hunderte von Zugriffen verschiedender Nutzer gleichzeitig erfolgen. Oder mehrere Leute teilen sich einen DSL-Anschluss mit Flatrate, etc.
Will man nun aber einem Benutzer eine "personalisierte" Webseite oder seinen eigenen Warenkorb präsentieren, so muss man irgendwie in der Lage sein, seine Zugriffe von denen anderer Benutzer mit hinreichender Sicherheit zu unterscheiden, um jedem die jeweils richtigen Inhalte zu präsentieren. Hierzu vergibt man sogenannte Session-IDs, die es erlauben, die Zugriffe verschiedener Benutzer voneinander zu unterscheiden.
HTTP kennt so etwas wie "Sessions" aber erstmal nicht. Hier gibt es nur einzelne Abrufe, die nichts weiter miteinander zu tun haben. Das liegt einfach daran, dass HTTP ursprünglich wohl nur dazu gedacht war, Dokumente zu transportieren. E-Commerce, Warenkörbe oder personalisierte Webseiten waren offenbar definitiv nicht geplant. Um dennoch "Sessions" unterscheiden zu können, muss eine der nachfolgend geschilderten Techniken genutzt werden.
[zurück zur Übersicht]
Session-IDs in der URL
Session-IDs können z.B. als Parameter in der URL von Seitenaufruf zu Seitenaufruf mitgeschleppt werden, etwa so: http://www.hitforum.de/demo.php?sessionid=47110815.
GET /demo.php?sessionid=47110815 HTTP/1.0
Host: www.hitforum.de |
Abgesehen davon, dass es oft nicht wünschenswert ist, dass die Session-ID so offen sichtbar ist, ist dieses Verfahren auch recht aufwendig, weil jeder einzelne interne Link dynamisch so geändert werden muss, dass er um den Parameter Session-ID ergänzt wird. Tippt der Besucher eine URL dann selber ein, findet dieser Abruf nicht mehr innerhalb der Session statt, weil die ID fehlt. Session-IDs in der URL sind teilweise auch ein Risiko, da sie zu Experimenten und Manipulationen geradezu herausfordern, im Cache abgelegt werden, eventuell bei Aufrufen von Links an fremde Seiten mitgeschickt werden u.ä.
[zurück zur Übersicht]
Exkurs "Cookies"
Für Session-IDs und ähnliche Informationen wesentlich besser geeignet sind die sogenannten "Cookies". Bei diesen "Keksen" handelt es sich (normalerweise) um kleine Textdateien, die bei HTTP im Headerbereich mitgeschickt werden.
Content-type: text/html
set-cookie: sessionid=47110815
<HTML><BODY><H1>Hello World!</h1></HTML></BODY> |
Hier wird versucht, ein Cookie mit dem Namen "sessionid" und dem Wert 47110815 zu setzen.
Das Cookie wird vom Server bei seiner Antwort also im Headerbereich der HTTP-Response mitgeschickt. Der Browser entscheidet je nach Konfiguration, ob er das Cookie akzeptiert oder nicht. Wenn er es annimmt, dann merkt er sich, woher er das Cookie bekommen hat und speichert es.
Bei allen folgenden Zugriffen auf denselben Server wird der Browser das Cookie mit seiner Anfrage automatisch im Headerbereich des HTTP-Requests mitschicken. Der Server erkennt dann den Benutzer an Hand dieses Cookies, das z.B. eine Session-ID enthalten kann.
GET /demo.php HTTP/1.0
Cookie: sessionid=47110815
Host: www.hitforum.de |
Diese Beispiele sind (wie alle Darstellungen hier) stark vereinfacht. In Wirklichkeit haben Cookies auch noch ein Verfallsdatum und können bestimmten Domänen und Unterverzeichnissen zugeordnet werden.
Viele Websites finanzieren sich durch Werbung, die von speziellen Werbeservern geholt und eingeblendet wird. So kann es vorkommen, dass ich im Laufe der Zeit z.B. zwanzig verschiedene Websites besuche, die alle den gleichen Werbepartner haben. Jedesmal werden Werbebanner eingeblendet, d.h. mein Browser nimmt Kontakt mit diesem Server auf. Habe ich nun beim ersten Besuch ein Cookie vom Server erhalten, bin ich für ihn auch dann erkennbar, wenn ich von einer ganz anderen Website her komme. Nun ist es dem Werbeserver also möglich, ein Profil über mein Surfverhalten anzulegen. Eventuell habe ich sogar bei einem meiner Besuche irgendwo meine E-Mail- oder Post-Adresse hinterlassen (um z.B. bei einem Gewinnspiel mitzumachen) und schon ist es vorbei mit der Anonymität.
Zur Ehrenrettung der Cookies sei unbedingt noch erwähnt, dass sie nun wirklich keine Viren oder ähnliches übertragen und dass sie eigentlich schon recht nützlich sind. Es kommt halt darauf an, wer sie zu welchem Zweck setzt. Eventuell sollte man erwägen, seinen Browser so einzustellen, dass alle Cookies beim Schließen des Browsers verfallen. So sind zwar Sessions per Cookie möglich, aber eben keine länger andauernden Profilbildungen.
[zurück zur Übersicht]
Cookie - Testscript
Hier findet sich ein kleines PHP-Skript, mit dem Cookies gesetzt, angezeigt und gelöscht werden können. Viel Spaß!
Und hier ist der Sourcecode des Cookie-Programms:
<?php
if (isset($cookie))
{
setcookie($cookie,$value,time()+$time,"","",FALSE);
header("Location: http://hitforum.de/test/cookie.php");
}
?>
<html>
<head>
<title>Testprogramm Cookie - Verwaltung</title>
</head>
<body>
<h1>Testprogramm Cookie - Verwaltung</h1>
<table border="1" cellpadding="30">
<tr><td>
<form action="cookie.php" method="post">
<table>
<tr><td>Cookie:</td>
<td><input type="text" name="cookie"
value="" size="12"></td>
</tr>
<tr><td>Wert:</td>
<td><input type="text" name="value"
value="" size="12"></td>
</tr>
<tr><td>Sekunden:</td>
<td><input type="text" name="time"
value="36000000" size="12"></td>
</tr>
<tr><td> </td>
<td align="right"><input type="submit"
value="setcookie!"></td>
</tr>
</table>
</form>
</td>
</tr>
</table>
<h1>Liste der gesetzten Cookies</h1>
<table border="1">
<?php
for($x=0;$x<sizeof($HTTP_COOKIE_VARS);$x++) {
echo "<tr><td>"
.key($HTTP_COOKIE_VARS)
."</td><td>"
.current($HTTP_COOKIE_VARS)
."</td></tr>\n";
next($HTTP_COOKIE_VARS);
}
?>
</table>
</body
|
Zu Beginn des Programms wird geprüft, ob ein Cookie zu setzen ist (dies ist genau dann der Fall, wenn die Variable $cookie einen Wert enthält, also "gesetzt" ist, bitte nicht verwirren lassen!).
Mittels setcookie() wird das Cookie gesetzt (genaugenommen heisst das lediglich, dass eine entsprechende Bitte im Header der HTTP-Response an den Browser übermittelt wird, der entscheidet dann, ob das Cookie gesetzt wird oder nicht!).
Weiterhin wird der Browser durch die Direktive "Location" im Header dazu veranlasst, das PHP-Script gleich nochmal aufzurufen, damit das soeben gesetzte Cookie auch sofort in der Liste der Cookies sichtbar wird (netter Trick, oder?).
Der Rest des Sourcecodes beschäftigt sich damit, dass das Formular aufgebaut und die Werte mittels "post" versendet werden. Und schliesslich werden auch noch die gesetzten Cookies aufgelistet. Das war's auch schon!
Hinweis: Wenn Sie mit Cookies experimentieren, die nur eine Lebenszeit im Sekundenbereich haben, müssen Sie schnell genug sein, sonst sind die schon abgelaufen, bevor Sie sie gesehen haben! Und weiterhin zu beachten ist, dass die Ablaufzeit der Cookies vom Server (nach seiner Uhr) gesetzt werden, aber vom Browser ausgewertet werden. Weichen die beiden Uhren voneinander ab, so gibt es kurzlebige Cookies, die schon beim Eintreffen im Browser abgelaufen sind (netter Effekt!).
[zurück zur Übersicht]
Exkurs: Formulare in HTML
Bevor wir uns gleich näher mit serverseitiger Dynamik befassen, wollen wir uns zuvor noch mal anschauen, wie denn Client und Server interagieren können.
Bei lokalen (clientseitigen) Skriptsprachen liegen ja alle Eingaben und Benutzerreaktionen lokal vor, sind für die Skriptsprache also zugänglich. Wie aber weiss das entfernt auf dem Server agierende Programm, was wir von ihm wollen?
Hier kommen nun die HTML-Formulare ins Spiel. Jeder hat sie sicher schon mal benutzt, sei es zum Eingeben der eigenen Adresse bei einer Bestellung, für die Eingabe der eigenen E-Mail-Adresse bei der Anforderung von Informationen, bei der Benutzung einer Suchmaschine, beim Login auf einer besonders geschützten Seite, etc.
Parameterübergabe mit GET
Werfen wir mal einen Blick auf ein typisches Formular:
Und so sieht der HTML-Code hierzu aus:
<form action="http://hitforum.de/demo.php" method="get">
<input type="text" name="num1" value="" size="9">
<input type="text" name="num2" value="" size="9">
<input type="submit" value="Addiere!">
</form>
|
In der ersten Zeile wird mit dem Tag <form> die Definition des Formulars eingeleitet und festgelegt wie und wohin die eingegebenen Formulardaten zu senden sind.
In der zweiten und dritten Zeile werden die Eingabefelder definiert, mit einem Namen ("num1" bzw. "num2") versehen, eine eventuelle Vorbelegung und die Feldgröße festgelegt.
In der vierten Zeile wird der Button zum Abschicken des Formulars angelegt und mit der Beschriftung "Addiere!" versehen.
In der fünften Zeile schließlich endet die Definition des Formulars. Fertig!
Wenn wir in die Felder beispielsweise die Werte "333" und "555" eintragen und den Button drücken, wird unser Browser die folgende HTTP-Anfrage verschicken:
GET /demo.php?num1=333&num2=555 HTTP/1.0
host: hitforum.de
|
Wie wir sehen, werden die Parameter in einer bestimmten Weise an die aufgerufene URL angehängt und mit dem GET-Kommando übermittelt.
Tatsächlich können die Formulardaten in dieser Weise auch händisch, d.h. ohne Formular versendet werden:
http://hitforum.de/demo.php?num1=333&num2=555
Nicht immer ist es erwünscht, dass die Formulardaten mit der URL sichtbar übertragen werden und so eventuell auf dem Weg zwischen Browser und Webserver in irgendeinem Cache oder Logfile landen. Wer möchte schon gerne, dass beispielsweise Passwörter in irgendwelchen Web- oder Cacheprotokollen zu finden sind.
Rufen Sie doch mal Ihre Lieblings-Suchmaschine durch manuelle URL-Eingabe auf und achten Sie dabei darauf, welche alten Aufruf Ihr Browser noch kennt und hilfbereit anbietet. Sein Cache weiss eine ganze Menge über das, was Sie so interessiert :-) .
Parameterübergabe mit POST
Hier haben wir das gleiche Formular wie oben noch einmal, aber mit einem wichtigen Unterschied:
Das Formular sieht genauso aus, den Unterschied kann man nur bei Betrachtung des Sourcecodes feststellen oder wenn man ganz aufmerksam auf die URL-Angabe im Browser nach dem Abschicken des Formulars achtet.
Hier ist der HTML-Code:
<form action="http://hitforum.de/demo.php" method="post">
<input type="text" name="num1" value="" size="9">
<input type="text" name="num2" value="" size="9">
<input type="submit" value="Addiere!">
</form>
|
In der ersten Zeile ist nun als Methode nicht mehr "GET", sondern "POST" angegeben. Das bedeutet nun nicht etwa, dass das Formular per Post verschickt wird, das wäre ja auch viel zu langsam :-). Vielmehr wird der Browser nun folgende Anfrage stellen:
POST /demo.php HTTP/1.0
Host: hitforum.de
Content-type: application/x-www-form-urlencoded
Content-length: 17
num1=333&num2=555
|
Die Formulardaten werden also nicht mit der URL übertragen, sondern nach der trennenden Leerzeile im "Body" der Anfrage. Das hat nicht nur den Vorteil, dass sie hier nicht ganz so leicht einzusehen oder manipulieren sind. Im "Body" lassen sich auch Datenmengen übertragen, die in der URL beim GET nicht mitgeschickt werden könnten, z.B. Dateien für einen Upload vom Client auf den Server.
Wenn Sie sich eingehender mit HTML und seinen Möglichkeiten beschäftigen möchten, dann empfehle ich Ihnen, sich mal SelfHTML näher anzuschauen:
www.netzwelt.com/selfhtml/
Der Selfhtml-Autor Stefan Münz hat zusammen mit Wolfgang Nefzger im Franzis-Verlag eine HTML-Bibel mit über 1900 Seiten in zwei Bänden veröffentlicht:
"HTML & Web-Publishing Handbuch" ISBN 3-7723-7515-4, 1312 Seiten, Eur 69,95, Themen: HTML - JavaScript - CSS -DHTML
"HTML & Web-Publishing Handbuch" ISBN 3-7723-7516-2, 592 Seiten, Eur 39,95, Themen: XML - DTDs - Perl/CGI)
Oder als Doppelpack unter der ISDN 3-7723-0598-9 für Eur 79,95
href="http://www.selfhtml.de/buchtipps.php3
Ebenfalls empfehlenswert ist das Buch von Günter Born "HTML Kompendium" Markt&Technik, ISBN 3-8272-5354-3, 1056 Seiten, EUR 49,95
http://www.mut.de/shop/sh-info.asp?ID=3827258308
Günter Born bietet ein HTML-Tutorial und eine HTML-Referenz zum Download an:
http://www.borncity.de/Web.htm.
Bei Lycos gibt es einen Workshop über HTML:
www.tripod.lycos.de/webmaster/topics/technic/html/
[zurück zur Übersicht]
Beispielprogramm zur Parameterübergabe mit GET und POST
Für weitere Versuche mit den Methoden "GET", "POST" und alternativ mit JavaScript hier ein Link zu unserem Beispiel-Formular und der zugehörige Quelltext.
Man beachte, dass hier das bei "action" angegebene Ziel-Dokument identisch mit dem Formular-Dokument ist! Dies ist durchaus üblich und bietet etliche Vorteile. So braucht man sich nicht mit zwei irgendwie zusammengehörenden Dokumenten herumschlagen und kann bei fehlerhaften Eingaben direkt das Formular (eventuell mit rot-markierten Hinweisen) erneut ausgeben.
<html>
<head>
<meta name="author" content="Michael Elschner">
<title>Aktive Inhalte im Web - Testskript</title>
</head>
<body>
<table border="1" cellpadding="30">
<tr>
<td>
<h1>Formular per POST</h1>
<form action="demo.php" method="post">
<table>
<tr>
<td>
1. Zahl:</td>
<td>
<input type="text" name="num1" value="" size="9">
</td>
</tr>
<tr>
<td>
2. Zahl:</td> <td>
<input type="text" name="num2" value="" size="9">
</td>
</tr>
<tr>
<td align="right">
<input type="submit" value="Addiere!">
</td>
</tr>
</table>
</form>
</td>
<td>
<h1>Formular per GET</h1>
<form action="demo.php" method="get">
<table>
<tr>
<td>
1. Zahl:
</td>
<td>
<input type="text" name="num1" value="" size="9">
</td>
</tr>
<tr>
<td>
2. Zahl:</td>
<td>
<input type="text" name="num2" value="" size="9">
</td>
</tr>
<tr>
<td align="right">
<input type="submit" value="Addiere!">
</td>
</tr>
</table>
</form>
</td>
</tr>
<tr>
<td colspan=>
<h1>JavaScript</h1>
<form action="demo.php" method="get" name="form">
<table>
<tr>
<td>
1. Zahl:</td> <td>
<input type="text" name="num1" value="0" size="9">
</td>
</tr>
<tr>
<td>
2. Zahl:</td> <td>
<input type="text" name="num2" value="0" size="9">
</td>
</tr>
<tr>
<td>
Summe:</td> <td>
<input type="text" name="sum" value="0" size="9">
</td>
</tr>
<tr>
<td align="right">
<input type="button" value="Addiere!"
onClick="form.sum.value=(form.num1.value)
-(-form.num2.value)">
</td>
</tr>
</table>
</form>
</td>
<td valign="top">
<h1>Ergebnis</h1>
<?php
$num1=$_POST[num1];
$num2=$_POST[num2];
if (!isset($num1)) {$num1=$_GET[num1];}
if (!isset($num2)) {$num2=$_GET[num2];}
echo "$num1 + $num2 = ", $num1 + $num2;
?>
</td>
</tr>
</table>
</body>
|
[zurück zur Übersicht]
Technischer Ablauf bei serverseitiger Dynamik
Aber zurück zur Technik. Der bisher geschilderte Ablauf stimmt so für statische Dokumente. Soll uns der Server jedoch dynamisch erzeugte Inhalte liefern, sieht es wie folgt aus:

Der Client fordert ein Dokument per HTTP-GET oder HTTP-POST an (1.). Bei entsprechender Konfiguration wird der Webserver (2.) das angeforderte Dokument nun aber nicht einfach unverändert an den anfragenden Browser schicken. Vielmehr wird er dessen Inhalt an ein externes Programm oder ein im Webserver integriertes Modul zur weiterreichen (3.), dort wird der aktive Inhalt ausgeführt (4.), das Ergebnis an den Webserver zurückgegeben (5.) und von diesem an den anfragenden Browser zurückgeschickt (6.).
[zurück zur Übersicht]
Common Gateway Interface (CGI)
Die älteste und wohl auch bekannteste Schnittstelle zwischen Webserver und externen Programmen ist das Common Gateway Interface (CGI).
Typische CGI-Aufrufe sehen in der URL wie folgt aus:
www.hitforum.de/cgi-bin/login.pl?name=bill+gates&pw=geheim
Über CGI kann ein externes Programm gestartet und mit Daten versorgt werden. Im angegebenen Beispiel wird der Webserver durch entsprechende Konfiguration erkennen, dass die Datei login.pl per CGI an den Perl-Interpreter zu übergeben ist.
Dem externen Programm (hier der Perl-Interpreter) werden alle notwendigen Parameter per Environment-Variablen oder über seine Standardeingabe mitgeben. Die Ausgabe des Programms wird von dessen Standardausgabe abgeholt und an den anfragenden Browser zurück gesendet.
Mittels CGI kann ein beliebiges externes Programm eingebunden werden. Dieses muss so gut wie nichts über HTTP und den Webserver wissen. Es muss lediglich in der Lage sein, die Environment-Variablen und seine Standardeingabe auszulesen und etwas sinnvolles (d.h. den Konventionen entsprechendes) auf die Standardausgabe zu schreiben. Hier können genauso gut selbst geschriebene C- oder Pascal-Programme, Shell-Aufrufe und ähnliches mehr zum Einsatz kommen. Die Ausgabe des Programms kann eine HTML-Datei, eine GIF-Grafik, eine Wave-Datei oder dergleichen mehr sein. Lediglich die passenden HTTP-Header-Zeilen (einschliesslich der trennenden Leerzeile) sind der eigentlichen Ausgabe voranzustellen. Das ist alles. Der Webserver reicht diese Ausgabe dann an den anfragenden Browser weiter, als hätte der den Inhalt ganz konventionell aus seinem Dateisystem ausgelesen.
Buchtipp: CGI Kurz und Gut www.oreilly.de/catalog/cgitbger/
[zurück zur Übersicht]
Perl
Perl ist eine Skriptsprache, die gerne zusammen mit CGI genutzt wird, aber nicht auf diesen Einsatzzweck beschränkt ist. Perl wurde von Larry Wall als "Practical Extraction & Report Language" entwickelt, also eigentlich als Listenauswertungs- und Reporterstellungssprache. Aber sehr schnell ist daraus eine vollwertige Skriptsprache für verschiedenste Einsatzzwecke geworden.
Beipielsweise wird Perl häufig auch von Systemadministratoren zur Vereinfachung ihrer täglichen Arbeit genutzt. Perl tritt also definitiv auch ausserhalb von Webservern auf .-) . Für den Einsatz mit Webservern, CGI und dem textbasierten Protokoll HTTP eignet sich die Sprache Perl dennoch, insbesondere aufgrund ihrer Fähigkeiten zur Textverarbeitung. So hat Perl beispielsweise eine sehr mächtige Engine für reguläre Ausdrücke.
Durch die riesige Sammlung von Modulen im CPAN (Comprehensive Perl Archive Network) werden alltägliche CGI-Aufgaben vereinfacht. Z.B. stellt das gleichnamige Modul CGI eine objektorientierte Schnittstelle für den Zugriff auf die GET- und POST-Parameter zur Verfügung. Für fast jeden denkbaren Einsatz gibt es bereits eine vorhandene Lösung.
Die Perl-Syntax (siehe unser Beispiel) ist Geschmackssache. Manche lieben sie, andere können sich nicht damit anfreunden. Das soll hier aber nicht weiter unser Thema sein :-) .
Da Perl nicht speziell für den Einsatz im Web geschaffen worden ist, müssen häufig spezielle Module für bestimmte Aufgaben installiert werden. Wenn man nicht selber Herr über den Server ist, weil man z.B. lediglich Webspace mit der Möglichkeit zu eigenen Perl-Programmen bei einem Provider nutzt, so hat man meist keine Kontrolle über die zur Verfügung stehenden Module. Dies kann den Einsatz schon durchaus mal erschweren. Hat man aber die volle Verfügungsgewalt über das System, wird die Flexibilität von Perl zu einer nicht zu verachtenden Stärke.
Unser Beispielprogramm erzeugt eine HTML-Seite mit der Auflistung aller vorhandenen Environment-Variablen. Man beachte, dass HTML hier lediglich als Ausgabe von perl auftritt und vergleiche das mit den nachfolgend beschriebenen Techniken.
In der ersten Zeile muss als Kommentar der Pfad zum Perl-Interpreter auf dem Webserver angegeben werden. Im weiteren Verlauf werden die HTTP-Headerzeilen ausgegeben, dann schliesslich die dynamisch erstellte HTML-Seite. "ENV" ist eine Liste, die alle Environmentvariablen mit Namen und Wert enthält.
#!/bin/perl
print "Content-type: text/html\n\n";
print "<HTML><BODY><H1>CGI-Environmentvariablen</h1>\n";
print "<pre>\n";
foreach (keys %ENV) {
print "$_ = $ENV{$_}\n";
}
print "</pre>\n";
print "</HTML></BODY>\n";
|
Homepage "perl.org":
www.perl.org
Comprehensive Perl Archive Network:
www.cpan.org
Perl bei O'Reilly:
www.perl.com
Kostenloser Perl-Interpreter für Windows:
www.activestate.com/Products/ActivePerl/
[zurück zur Übersicht]
Environment Variablen
Unter hitforum.de/test/ kann ein Testprogramm aufgerufen werden, das ebenfalls in Perl geschrieben ist und die wichtigsten Environment-Variablen zurückliefert.
Damit können wir uns einen Überblick verschaffen, was ein Webserver so alles über uns weiss. Die Ausgabe wird ungefähr so oder ähnlich aussehen:
GATEWAY_INTERFACE = CGI/1.1
HTTP_ACCEPT = image/gif, image/x-xbitmap, image/jpeg,
image/pjpeg, application/vnd.ms-excel,
application/msword,
application/vnd.ms-powerpoint, */*
HTTP_ACCEPT_ENCODING = gzip, deflate
HTTP_ACCEPT_LANGUAGE = de
HTTP_CONNECTION = Keep-Alive
HTTP_EXTENSION = Security/Remote-Passphrase
HTTP_HOST = hitforum.de
HTTP_USER_AGENT = Mozilla/4.0 (compatible; MSIE 5.5;
Windows NT 4.0; QXW0330w; OTCD)
PATH = /bin:/usr/bin
REMOTE_ADDR = 80.143.189.229
REMOTE_HOST = p508fbde5.dip.t-dialin.net
REMOTE_PORT = 1035
REQUEST_METHOD = GET
REQUEST_URI = /cgi-bin/printenv.pl
HTTP_REFERER = http://www.hitforum.de/linklist.html
HTTP_X_FORWARDED_FOR = 10.210.53.14
HTTP_VIA =
|
Unser Browser plaudert aus, dass wir etwas mit Excel, Word und Powerpoint-Dateien anfangen können (HTTP_ACCEPT), also wahrscheinlich diese Softwarepakete installiert haben.
Unsere bevorzugte Sprache ist deutsch (HTTP_ACCEPT_LANGUAGE), was auch einen internationalen Server dazu bewegen könnte, uns mit deutschen Seiten zu bedienen.
Welchen Browser wir nutzen, wird natürlich auch mitgeteilt (HTTP_USER_AGENT), damit uns der Server angepassten HTML- oder JavaScript-Code liefern kann.
Unsere IP-Adresse (REMOTE_ADDR) und den Namen des Rechners (REMOTE_HOST) bzw. die des genutzten Proxys sieht der Webserver, gegebenenfalls auch noch die tatsächliche Adresse für die der Proxy tätig wurde (HTTP_X_FORWARDED_FOR).
Und dann verraten wir auch noch, von welcher Seite wir herkommen (HTTP_REFERER). So kann der Webmaster feststellen, ob seine Besucher von einer Suchmaschine vorbeigeschickt worden sind oder ob eine befreundete Site sie hergeleitet hat.
[zurück zur Übersicht]
Server Side Includes
Wie wir gesehen haben, wird beim Einsatz von CGI/Perl das durch die URL referenzierte Dokument als Quelltext interpretiert und ausgeführt. Das Perl-Programm erzeugt dann die HTML-Seite (wenn denn eine zurückgegeben werden soll) als Ausgabe.
Ein ganz anderer Ansatz wird nun bei den Server Side Includes verfolgt. Hier enthält das durch die URL referenzierte Dokument bereits den HTML-Code, der auch ausgegeben werden soll. Lediglich an bestimmten Stellen sind in den HTML-Code dynamische Teile eingebettet. Nur diese werden zur Ausführung gebracht und durch ihre jeweiligen Ausgaben ersetzt.
Echte Perl-Freaks werden es zwar bestreiten (zumal es in Perl durchaus auch Konstrukte gibt, so etwas nachzubilden) aber grundsätzlich ist das schon ein Unterschied und der SSI-Ansatz durchaus leichter lesbar.
Übrigens nutzen alle weiteren noch vorzustellenden Verfahren, wie PHP, ASP, JSP, etc. ebenfalls den Ansatz mit dem "embedded code", an dieser Idee muss also wohl was dran sein :-) !
Wie sieht denn nun ein solcher durch SSI angereicherter HTML-Code aus?
<html>
<h1>Ein Beispiel für Server Side Includes (SSI)</h1>
<!--#include file="menu.inc"-->
<p>
Letzte Änderung dieses Dokuments:
<!--#flastmod file="test.shtml"-->
</p>
<p>
Ausgabe eines Perl-CGI-Skripts:
<!--#include virtual="/cgi-bin/ticker.pl?id=4711"-->
</p>
<p>
Heutiges Datum: <!--#exec cmd="/bin/date"-->
</p>
</html>
|
Wie wir sehen, sind die Server Side Includes alle in HTML-Kommentare eingeschlossen und durch ein vorgestelltes "#"-Zeichen markiert. Allerdings wird man als normalsterblicher Surfer diesen Code so niemals sehen, da er eben bereits serverseitig gegen die entsprechenden Ausgaben ausgetauscht wird.
Nähere Infos zu SSI gibt es unter anderem hier:
SSI Commands:
www.unidata.ucar.edu/staff/robb/gemstone/servlet/ssi_commands.hrml
SSI Features:
free.prohosting.com/~sampieri/freefaq/g_ssitest.shtml
[zurück zur Übersicht]
PHP
PHP steht für "PHP Hypertext Preprocessor". Wer weiss, dass GNU für "GNU is Not Unix" steht, wundert sich nicht mehr über Abkürzungen, deren erster Buchstabe für die Abkürzung selber steht :-) .
PHP ist eine sehr, sehr leistungsfähige Skriptsprache, die in letzter Zeit zunehmend beliebter wird, insbesondere in der Kombination "Linux - Apache - mySQL -PHP" kurz auch "LAMP" genannt. Hier gibt es auch durchaus den einen oder anderen Provider, bei denen man für ein paar Euro im Monat PHP4 und mySQL zur Verfügung gestellt bekommt und sich in einer Sandbox austoben kann.
PHP ist insbesondere dem Einsteiger zu empfehlen.
Schauen wir uns mal ein kurzes PHP-Beispiel an:
<html>
<p>
Ihr Zugriff erfolgt von der IP-Adresse:
<?php
$ip = getenv("REMOTE_ADDR");
echo $ip;
?>
</p>
</html>
|
Der PHP-Code wird hier also in einem speziellen Tag <?php... ?> eingeschlossen, die Ausgaben in den HTML-Code eingebettet.
Mehr zu PHP gibt es unter anderem hier:
SelfPHP (Referenz):
www.selfphp.info
PHP Hypertext Processor:
www.php.net/
PHP/mySQL-Workshop bei Lycos:
www.tripod.lycos.de/webmaster/topics/technic/php/
Jede Menge Infos zu PHP (englisch), u.a. auch ein Tutorial
http://hotwired.lycos.com/webmonkey/programming/php/index.html
und noch mehr Stoff zu PHP
http://www.faqts.com/knowledge_base/index.phtml/fid/51
[zurück zur Übersicht]
JSP - Java Server Pages
Java ist uns ja bereits im Zusammenhang mit clientseitiger Dynamik begegnet. Selbstverständlich kann Java auch serverseitig genutzt werden. Man spricht dann nicht von "Applets" sondern logischerweise von "Servlets".
Mit "Java Server Pages (JSP)" steht nun eine Technologie zur Verfügung, die die Nutzung von serverseitigem Java und HTML verbindet. Hier werden (wie auch schon bei PHP und anderen Lösungen) die Servlet-Aufrufe direkt in den auf dem Server vorliegenden HTML-Quelltext eingebettet und die Servlet-Ausgaben fliessen direkt in den an den Browser geschickten HTML-Codes ein.
Zum Thema Java Server Pages gibt es viele brauchbare Informationen im Web, so dass wir uns hier vorläufig erstmal mit einem Beispiel und ein paar Links begnügen. Wir hoffen, dieses Thema in nächster Zeit noch weiter vertiefen zu können, dann wird es auch hier neuen Lesestoff geben!
<html>
<body bgcolor="white">
<h1> Request Information </h1>
<font size="4">
JSP Request Method: <%= request.getMethod() %> <br>
Request URI: <%= request.getRequestURI() %> <br>
Request Protocol: <%= request.getProtocol() %> <br>
Servlet path: <%= request.getServletPath() %> <br>
Path info: <%= request.getPathInfo() %> <br>
Path translated: <%= request.getPathTranslated() %> <br>
Query string: <%= request.getQueryString() %> <br>
Content length: <%= request.getContentLength() %> <br>
Content type: <%= request.getContentType() %> <br>
Server name: <%= request.getServerName() %> <br>
Server port: <%= request.getServerPort() %> <br>
Remote user: <%= request.getRemoteUser() %> <br>
Remote address: <%= request.getRemoteAddr() %> <br>
Remote host: <%= request.getRemoteHost() %> <br>
Authorization scheme: <%= request.getAuthType() %> <hr>
The browser you are using is
<%= request.getHeader("User-Agent") %> <hr>
</font>
</body>
</html>
|
Im Rahmen des Jakarta-Projekts der Apache Software Foundation gibt es Tomcat, eine frei verfügbare Implementation, mit der Servlets und JSP (zum Beispiel zusammen mit dem Apache Webserver) genutzt werden können:
http://jakarta.apache.org/tomcat/
JSP bei Sun: http://java.sun.com/products/jsp/
Java Server Pages Technology:
http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/JSPIntro.html
What is a JSP Page? (Tutorial)
http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/JSPIntro2.html#72724
Syntax Reference: http://java.sun.com/products/jsp/tags/12/syntaxref12.html
Java Server Pages
www.ita.hsr.ch/Downloads/unterlagen/seb/2b-ServerSideAnwendungen.pdf
Uni Linz Skript zu JSP:
www.ssw.uni-linz.ac.at/Teaching/Lectures/Sem/2000/Leitenmueller/
Buchtipp JSP: http://www.oreilly.de/catalog/jserverpagesger/
Buchtipp JSP:
shannon.informatik.fh-wiesbaden.de/jsp/jsp/inhalt.html
[zurück zur Übersicht]
ASP - Active Server Pages
Active Server Pages sind, wenn man so will, die JSP-Version von Microsoft, bzw. umgekehrt, je nach Weltanschauung :-).
Bei ASP können nahezu beliebige Skriptsprachen zum Einsatz kommen (auch Perl). Aber die Haus -und Hof-Skriptsprache von Microsoft ist und bleibt VBscript, das auf Visual Basic basiert.
Auch hier müssen bis auf weiteres erst einmal ein Beispiel und einige Links genügen:
<%@ LANGUAGE="VBSCRIPT" %>
<HTML>
<HEAD>
<TITLE>ASP-Bespiel</TITLE>
</HEAD>
<BODY>
<%
If NOT(IsEmpty(Request.QueryString("Eingabe")))
Then
Response.Write("Ihre Eingabe: "
& Request.QueryString("Eingabe"))
Response.Write("<HR>")
Response.Write("Aktuelles Serverdatum/zeit "
& Date & " - " & Time)
Else
%>
<FORM action="aspbsp.asp?" method="get">
<INPUT type=text name="Eingabe" size=30>
<INPUT type=submit name="Submit"
value="Abschicken">
<INPUT type=reset name="Reset"
value="Löschen">
</FORM>
<%
End If
%>
</BODY>
</HTML>
|
ASP-Beispiele und weitere Links:
www.space.net/support/windows/dokumentationen/asp/
ASP - FAQ:
www.aspfaq.de
Deutsche ASP-Beschreibung www.weblehre.de/verfahren/asp.htm
ASP-Quellcode-Beispiel: www.schulungsconcept.de/2000/asp/aspworkshop/
ASP-Seminar: www.schulungsconcept.de/2000/asp/aspworkshop/default.asp
[zurück zur Übersicht]
CFM - Cold Fusion
Seit Anbeginn dabei und noch lange nicht ausgeschieden! Im Gegenteil, jetzt gibt es neu ColdFusion MX.
Ein Cold Fusion System ist sozusagen ein eigener Application-Server mit vielfältigen Möglichkeiten. Auch hier nur kurz der Ausriss aus einem Beispiel und eine Handvoll Links:
<!--- Cold-Fusion: list.cfm --->
<!--- Ausgabe der Mitarbeiter-Liste --->
<head><title>Liste</title></head><body>
<!--- alle Mitarbeiter auslesen --->
<!--- Abteilungsnamen integrieren --->
<CFQUERY NAME="qMitarbeiter"
DATASOURCE="firma" CACHEDWITHIN="#cacheTime#">
SELECT mit_id, name, vorname,
geschlecht, gehalt, abteilungsname
FROM abteilung INNER JOIN mitarbeiter
ON abteilung.abt_id = mitarbeiter.abt_id
ORDER BY mit_id
</CFQUERY>
<table> <!--- Tabellenheader --->
<tr bgcolor="#cccccc"><td> </td><td><b>Anrede</b></td>
<td><b>Name</b></td><td><b>Mitarb.-ID</b></td>
<td><b>Abteilung</b></td><td><b>Gehalt</b></td>
<td> </td><td> </td>
</tr>
<!--- Tabellenbody --->
<CFOUTPUT QUERY="qMitarbeiter"><tr bgcolor="##eeeeee">
<!--- aktuelle Zeilennummer --->
<td>#qMitarbeiter.currentRow#.</td>
<td>
<!--- Geschlecht-Wert in Anrede konvertieren --->
<CFIF qMitarbeiter.geschlecht eq "m">
Herr <CFELSE> Frau
</CFIF>
</td>
...
|
Philipp Cielen / Steffen Goldfuss / Christoph Schmitz
ColdFusion MX - Professionelle Anwendungsentwicklung fürs Web
ISBN: 3-8273-2068-2 / 912 Seiten - 1 CD / € 49,95 [D]
www.addison-wesley.de/main/main.asp? page=home/bookdetails&ProductID=13422
Charles Mohnike: ColdFusion in 21 Tagen
ISBN: 3-8272-6017-5, 816 Seiten, 1 CD, EUR 49,95
http://www.mut.de/shop/sh-info.asp?ID=3827260175
Link zum Hersteller macromedia (früher Allaire):
http://www.macromedia.com/
Cold Fusion Portal cfml.de
Cold Fusion User Group cfug.de
[zurück zur Übersicht]
Application Server
Mit den "Application Server" sind wir definitiv in der Business Class angekommen. Wir halten dieses Thema für so wichtig und interessant, dass wir demnächst hierzu einen eigenen Termin einplanen wollen. Danach wird es auch hier mehr zu diesem Thema geben. Für jetzt erstmal in aller Kürze:
Application Server sind eigenständige, vom Webserver unabhängige Server, die zum Beispiel Java-Code ausführen und hier alle nur denkbaren Möglichkeiten bieten. Vorteil der Trennung von Web- und Application-Server ist u.a. dass die Systeme besser skalieren, also dem Leistungsbedarf angepasst werden können, beispielsweise durch Einsatz einer ganzen Server-Farm und Loadbalancing. Hierdurch können hoch performante, hoch verfügbare Lösung erstellt werden. Große und größte Websites werden mit dieser Technologie realisiert. Stichworte in diesem Umfeld sind J2EE (Java 2 Enterprise Edition), Java Beans, CORBA bzw. DCOM. Im Hintergrund sind meist auch noch diverse Datenbanken im Spiel. Insgesamt also keine billige Lösung, aber eben das, was in der Profiklasse eingesetzt wird :-). Application Server gibt es von so gut wie jedem der Big Player im Markt und von etlichen (kleineren) Spezialisten. Der große Vorteil beim Einsatz von Java ist natürlich die Kompatibilität über verschiedenste Plattformen hinweg. Nun ja, in der Realität muss man das dann leider doch wieder etwas einschränken. Sobald irgend eines der verlockenden, netten, aber leider sehr speziellen Features genutzt wird, durch die sich die verschiedenen Application Server unterscheiden, ist es natürlich wieder aus mit dem "write once - run everywhere".
Wir freuen uns schon darauf, dieses Thema demnächst (2. Hälfte 2002) zu vertiefen. Bis dahin erstmal ein paar Links zum Thema:
Einen Überblick über Application Server, Web Services, SOAP und Java liefert
http://www.torsten-horn.de/techdocs/applicationserver.htm
J2EE-Application Server - Grundlagen und Marktübersicht
http://www.networkcomputing.de/heft/buyers%20guide/bg_0402.html
Middleware - Application Server - IT-Welten in Verbindung
www.informationweek.de/index.php3?/channels/channel23/001142.htm
[zurück zur Übersicht]
Sicherheitsaspekte
Wie schon erwähnt, sind aktive Inhalte aus Sicherheitsgesichtspunkten nicht ganz unbedenklich. Kurz gesagt, tritt das Problem dabei generell auf der Seite auf, auf der der Code aktiv ist. Das heisst also, bei clientseitiger Dynamik ist gegebenenfalls der Rechner des "Surfers" gefährdet, bei serverseitiger Dynamik der Webserver.
Trotz aller Sicherheitsbarrieren kommt es immer wieder zu Sicherheitsverletzungen. Teilweise liegt das daran, dass die entsprechenden Programme Sicherheistlücken enthalten. Ein Server ist vielleicht anfällig gegen gezielte Pufferüberläufe, ein Plugin erlaubt Zugriff auf eigentlich geschützte Bereiche oder Angriffe werden geschickt verpackt und an der Firewall vorbei geschmuggelt.
Die folgenden Links sollen einen kurzen Überblick über die Gefährdungen geben.
Beim BSI (Bundesamt für Sicherheit in der Informationstechnike) findet sich dieser empfehlenswerte Artikel:
Ausführbare Inhalte - Sicherheitsrisiken und Lösungen
http://www.bsi.de/taskforce/literatur/aktivinh.htm
Weiterhin gibt es beim BSI zum Thema auch noch diese Studie hier (sie ist zwar schon von 1999 aber trotzdem nicht minder aktuell):
http://www.bsi.de/aufgaben/projekte/ococat/ococat.htm
Aktive Inhalte aus der Sicht eines Firewall-Herstellers
http://www.genua.de/forum/artikel/itbusiness/index_html
Aktive Inhalte und ihre Gefahren (Java, ActiveX, JavaScript)
http://zeus.fh-brandenburg.de/infoalt/fhbi_labore/sicherheit/ ss2001/itsecweb/node46.html
Was sind aktive Inhalte und wie sieht es mit dem Thema Sicherheit aus?
Behandelt Java, JavaScript und ActiveX
http://www.sicherheit-im-internet.de/themes/print.phtml?ttid=1&tdid=36
Die Deutsche Vereinigung für Datenschutz (DVD) e.V. führt eine "Schwarze Liste" von Webseiten, die ohne JavaScript, ActiveX, Cookies o.ä. nicht genutzt werden können.
http://www.aktiv.org/DVD/Schwarze%20Liste/start.html
[zurück zur Übersicht]
Links zum Thema
Eine sehr gute Einführung in das Thema "Aktive Inhalte im Web" bietet http://www.torsten-horn.de/techdocs/db-web.htm
Dieser Artikel passt ganz gut zum Thema
http://www.ifi.unizh.ch/ikm/Vorlesungen/CSCW/CSCW_WS0001/ CSCW_WS0001/Documents/CSCW_WebTechnologien.pdf
[zurück zur Übersicht]
|