Rene K. schrieb:
Ein T. schrieb:
Es ist immer wieder erstaunlich, welche Klimmzüge manche Leute unter-
und in Kauf nehmen, um drei Minuten Arbeit zu sparen. ;-)
Nun, um in einem responsive Design Daten in eine Datenbank zu schreiben
muss ich dann entweder NODE.js nutzen oder eben auch ein PHP basierendes
Backend. Die "Klimmzüge" sowie die Sicherheit um die Daten an das
jeweilige Backend zu "schicken" bleiben bei allen drei die gleiche.
Puh, wo fange ich da an? Okay, machen wir mal was ganz Ungewöhnliches und
beginnen am Anfang.
Also, dieses HTTP ist ein Protokoll, das grundsätzlich erstmal keinen
Zustand hat. Eine Anfrage vom Webbrowser an den Webserver (Request) wird
mit vom Webserver beantwortet (Response), und an diesem Punkt ist das
Gespräch dann auch beendet. (Fisimatenten für mehr Performance wie HTTP
Keepalive sind hier erstmal uninteressant.) Wenn der Webbrowser nun eine
neue Anfrage an den Server und der eine Antwort an den Webbrowser schickt,
dann ist das ein neues Gespräch und vom vorherigen komplett unabhängig: der
Webserver kann nicht erkennen, ob diese zweite Anfrage von demselben
Webbrowser geschickt worden ist oder von einem anderen.
Nun ist es aber so, daß für bestimmte Anwendungsfälle zwingend nötig ist,
daß der Server den Webbrowser wieder erkennen kann, denk zum Beispiel an
einen Warenkorb. Deswegen kann der Webserver den Webbrowser anweisen,
kleine Datenmengen (die sogenannten Cookies) zu speichern und bei jedem
zukünftigen Request mit zu senden. Die Anweisung gibt der Webserver mit dem
HTTP-Header "Set-Cookie" und dabei können auch mehrere Cookies gesetzt
werden. Cookies können zudem einige Einstellungen enthalten, zum Beispiel
wann sie gelöscht werden, für welche Domain(s) sie gelten, und so weiter.
Das ist alles erstmal richtig schick und theoretisch könntest Du Deine
Daten auch einfach in Cookies speichern, die Dein Server mit "Set-Cookie"
an Deinen Webbrowser übergibt und die Dein Webbrowser dem Server im
nächsten Request wieder zurückschickt.
Wenn wir jetzt nochmal nachdenken, wird aber schnell klar, daß der Ansatz
zwei massive Probleme hat. Erstens dürfen Cookies höchstens 4096 Bytes groß
sein, da passen große Warenkörbe womöglich nicht hinein. Ein noch viel
größeres Problem ist allerdings, daß die Daten, die der Webbrowser an
Deinen Webserver im HTTP-Header "Cookie" schickt, manipuliert werden
können.
Solche Manipulationen lassen sich nur auf zwei Weisen verhindern: entweder
durch eine Verschlüsselung der Daten in den Cookies, was aber gemeinhin die
Größe der Nutzdaten weiter verringert. Oder, indem die Daten gar nicht an
den Webbrowser gesendet, sondern vom Webserver gespeichert werden und der
Webbrowser nur einen Cookie mit einer Kennung erhält, anhand derer der
Server ihn wiedererkennen und seine Daten wiederfinden kann.
Diese letztgenannte Technik wird als Session bezeichnet, und die Kennung
als Session-ID. Dabei ist es extrem wichtig, daß die Session-ID nicht von
Dritten erraten werden kann, sonst könnte ein Angreifer ja einfach eine
fremde Session übernehmen -- das nennt sich dann Session-Hijacking.
Dasselbe gilt. wenn jemand an eine fremde Session-ID kommt: dann er die
Session natürlich ebenfalls stehlen, deswegen HTTPS unser Freund.
Tatsache ist also nun, daß die Daten der Session auf dem Server verbleiben,
und der Browser Deines Besuchers nur die Session-ID kennt. Die kann er
ruhig manipulieren: wenn er eine falsche Session-ID schickt, findet der
Server eben einfach keine Session und keine Sessiondaten für diese
Session-ID.
Okay, schauen wir uns mal an, wie PHP das mit den Sessiondaten macht. Ohne
weitere Konfiguration speichert PHP die Sessiondaten in Dateien im
Verzeichnis /tmp in Dateien, deren Name mit sess_ beginnt, danach folgt
die Session-ID. Das ist einerseits meistens nicht sehr performant (außer
bei Systemen, die /tmp in ein tmpfs im Arbeitsspeicher legen -- aber dort
sind die Sessiondaten bei jedem Reboot weg) und auch nicht besonders
sicher, denn Benutzer auf dem System können dann womöglich fremde
Session-ID mit einem einfachen ls(1) herausfinden.
Was heißt das jetzt alles für Dich, außer daß Dich so ein oller Pedant mit so Webgedöns zugelabert hat? Erstmal nur, daß Du mit dem JavaScript, das im Webbrowser läuft, nicht direkt auf Daten zugreifen kannst -- weder lesend noch schreibend -- die auf Deinem Webserver gespeichert sind. Dazu benötigst Du eine "aktive Komponente", also ein Programm (bzw. Skript) auf dem Server.
Andererseits ist die Frage, ob Deine Daten überhaupt dem Server bekannt
sein müssen oder es ausreicht, wenn Dein Webbrowser sie kennt. In diesem
Fall gäbe es nämlich viel elegantere Möglichkeiten im Browser, namentlich
LocalStorage, SessionStorage (hat trotz des Namens nichts mit den weiter
oben beschriebenen serverseitigen Sessions zu tun), und sogar eine
Datenbank (ok, ein NoSQL Key-Value-Store) namens IndexedDB.
Klar, auch für diese drei gilt: wenn die Inhalte daraus an den Server
gesendet werden, können sie manipuliert sein. Oder der Benutzer kommt
morgen mit einem anderen Gerät oder Browser, oder er löscht die Daten: dann
sind sie weg, also nicht verfügbar. So ganz sind die Notwendigkeiten und
Anwendungsfälle für die weiter oben beschriebenen serverseitigen Sessions
also noch nicht eliminiert.
Welche Methode Du wählst, oder ob Du womöglich sogar mehrere davon nutzt,
hängt also, wie so oft, sehr direkt von Deinem genauen Anwendungsfall ab.
Klar, bei einer Datenbank bleiben die Daten auf jeden Fall permanent
bestehen (Cookie löschen, Cookie abgelaufen... etc.). Die Klimmzüge aber
sind durchaus "wuchtiger" als eine Session Variable zu ändern: Die Werte
in die DB schreiben, die Werte beim Start auslesen...
Ja, und dazu kommt der Aufwand, die Datenbank aufzusetzen, zu betreiben, und zu pflegen... wobei "Datenbank" ja nicht unbedingt ein klassisches SQL-RDBMS sein muß, sondern auch etwa ein simpler Key-Value-Store sein kann. Es kommt, wie so oft, eben immer auf die genauen Anforderungen an.