PHP Sessions & Cookies - Kurzer Überblick

  • Dieses Tutorial soll einen kurzen Überblick zu Sessions & Cookies in PHP geben.
    Dabei werden Zusammenhänge erläutert und Gerüchte aufgeklärt.
    Grundlegende PHP-Kenntnisse und ein Verständnis für die Arbeit eines Webservers sowie Internetbrowsers sind erforderlich.

    PHP Sessions & Cookies


    • Motivation
    • Cookies: Ein Sicherheitsrisiko?
    • Sessions / Sitzungen
    • Die Session-Verwaltung
    • Bonus: Session-Hijacking
    • Schlusswort


    1 Motivation

    Jeder kennt es von Online-Shops, Foren, Videoplattformen oder Webmail-Diensten: Benutzer können sich über ein Formular einloggen und bleiben für einen bestimmten Zeitraum, etwa bis zum Ausloggen oder Schließen des Browsers. Da HTTP ein statusloses Protokoll ist, gestaltet es sich schwierig, einen Nutzer zwischen zwei Seitenaufrufen zu identifizieren. Nun gibt es unterschiedliche Ansätze, auf dieses Problem zu reagieren:

    • IP-Adresse zur Identifizierung nutzen
    • GET-Parameter an die URL hängen
    • ...

    Man könnte sich noch mehr einfallen lassen und die Methoden auf mehreren Seiten langwierig erörtern.
    Es geht jedoch auch anders, wie wir es im nächsten Abschnitt sehen werden.



    2 Cookies: Ein Sicherheitsrisiko?
    Die Kekse sind ein mächtiges Werkzeug, um das eingangs erwähnte Problem weitgehend zu lösen.


    Wie funktioniert ein Cookie?
    Der Server, den wir mittels PHP erweitern, kommuniziert mit dem Browser des Benutzers. HTTP/1.1 und HTTP/2.0 unterstützen folgende Funktion: Der Server kann per Befehl Daten auf dem Rechner des Users abspeichern und auslesen. Dazu wird ein Befehl gesendet, den der Browser ausliest. Dieser legt in der Cookie-Verwaltung (variiert abhängig vom Hersteller) eine neue Datei an oder speichert die Daten in eine existierende Datei. Bei jedem Seitenaufruf sendet der Browser nun alle Daten, die der Server hat abspeichern lassen, zurück an den Server. So ist es relativ einfach möglich, Benutzer zu reidentifizieren.


    Ist das nicht ziemlich unsicher?
    Selbstverständlich unterliegt das System strengen Einschränkungen. So kann der Server beispielsweise keine 200 GB Cookies an den Browser senden, um den Schreibkopf der Festplatte vor dem Einrosten zu schützen. Auch schreibt der Standard vor, dass ein Browser ab 300 Cookies insgesamt oder 20 Cookies pro Domain von hinten aufräumen darf. Hier ist es natürlich möglich, dass Hersteller ein größeres Limit implementieren oder gar den User eine Auswahl treffen lassen. Darüber hinaus dürfen Cookies nicht größer als 4096 Bytes sein - das umfasst den Namen des Cookies, das Ablaufdatum und den Inhalt.


    Cookies werden also genutzt, um mich auszuspähen?
    Auch das ist weitgehend ein Gerücht. Cookies, die ein anderer Webserver gesetzt hat, können nicht ausgelesen werden. Setzt Google also beispielsweise ein Cookie in unserem Browser, so kann Dev-Tek dieses nicht auslesen - es sei denn, eine gravierende Sicherheitslücke ist im Browser vorhanden.
    Trotzdem ist der Einwand nicht ganz unberechtigt: Sehr viele Internetseiten verwenden Werbung von Google (oder anderen Anbietern), die auch Cookies nutzt. Da eine Verbindung zu den Google-Servern hergestellt wird, kann das Surfverhalten auf unterschiedlichen Websites hier tatsächlich zusammengeführt werden. Ein AdBlocker wie AdBlockPlus oder µBlock als OpenSource-Alternative schafft da in der Regel Abhilfe.


    Die Cookies sind also doch gar nicht so böse?
    Cookies stoßen bei vielen Verbrauchern direkt negativ auf. Ob das triftige Gründe hat ... darüber lässt sich streiten. Fakt ist, dass Cookies im Web 2.0 nahezu unverzichtbar sind und, sofern die Implementierung in Browser und WebServer einigermaßen fehlerfrei aussieht, Komfort und Sicherheit zugleich bieten.



    3 Sessions
    Es gibt ein ziemlich großes Problem mit den Cookies: Die Maximalgröße ist auf 4096 Bytes beschränkt. Da ist so mancher Brief schon deutlich länger. PHP ist aber nicht ohne Grund so erfolgreich: Mit den komfortablen Sessions stellt PHP diverse kommerzielle Projekte in den Schatten.


    Wie funktioniert's?
    Sessions funktionieren mit Cookies.
    Zunächst wird dem Benutzer ein Cookie mit einer zufällig generierten, einzigartigen ID, gesendet. Diese ID ist nicht länger als 64 Zeichen (= 64 Bytes). Gleichzeitig legt PHP auf dem Webserver in der internen Session-Verwaltung eine Datei mit der ID als Dateinamen an. Alle Daten, die man normalerweise auf dem Rechner des Benutzers speichern würde, können nun ganz einfach in diese Datei geschrieben werden. Der Browser des Nutzers sendet einfach immer nur die vergebene ID, sodass der Webserver die Datei suchen kann und die gespeicherten Daten erreicht.


    Ist das sicher?
    Sessions sind in der Regel sogar sicherer als Cookies. Die Daten werden gar nicht an den Browser gesendet und bleiben in der Session-Verwaltung auf dem Webserver. Mehr zu Session-Verwaltung im nächsten Abschnitt.


    Anwendungsbeispiel

    Hier wird eine Session zum Zählen der Seitenaurufe eines Benutzers verwendet. Wichtig ist, dass ein Löschen aller Cookies auch die Session zurücksetzt.



    4 Session-Verwaltung
    Wie erwähnt verwaltet PHP intern ein Dateisystem, um die Daten einer Session der sogenannten Session-ID zuzuordnen. Es ist aber genauso gut möglich, eine eigene Session-Verwaltung zu programmieren und PHP anzuweisen, diese zu verwenden. Besonders für größere Websites ist es häufig von Interesse, eine Datenbank für die Session-Verwaltung, sei es MySQL, MongoDB oder Marke Eigenbau XY, zu verwenden. Die mitgelieferte Session-Verwaltung ist aber schon ziemlich leistungsfähig und dürfte auch den Ansprüchen vieler mittelständischen Unternehmen genügen. Da PHP einfach viele der größten Seiten des World Wide Web antreibt, dürfen solche Funktionen natürlich nicht fehlen.


    Eine eigene Session-Verwaltung ist aber nicht ganz trivial und würde den Rahmen dieses Tutorials sprengen.
    Falls genug Interesse besteht, ist ein eigenes Tutorial dazu denkbar.



    5 Bonus: Session-Hijacking
    Abschließend noch ein paar kurze Infos zu einem Sicherheitsthema: Dem Session-Hijacking. Gemeint ist eine Methode, die Session-ID fremder Benutzer herauszufinden und die Session des Nutzers zu übernehmen. Schlimmstenfalls kann der Angreifer im Namen des Opfers unter falscher Identität handeln. Ich werde die Vorgehensweise exemplarisch erklären. Um sicherheitstechnische Maßnahmen zu ergreifen, ist es überaus hilfreich, das Vorgehen von Angreiferen zu verstehen. Die Erklärungen dienen ausschließlich zu Lernzwecken und sind keine Anleitung zum Angreifen fremder Systeme.


    Schritt 1: Session-ID ermitteln
    Wenn die Session-Verwaltung in einem zugänglichen Verzeichnis liegt, könnte der Angreifer über die Browserzeile dorthin navigieren und mit etwas Glück die Session-Dateien finden. Werden die Sessions in einer Datenbank gespeichert, so wäre ein unbefugter Zugriff auf die Datenbank verhehrend. Bei dateibasierten Datenbanken sollte unbedingt dafür sorgt sein, dass diese nicht von Außen erreichbar sind bzw. heruntergeladen werden können.
    Der Angreifer könnte auch mithilfe von XSS (Cross-Site-Scripting) oder CSRF (Corss-Site-Request-Forgery) ein JavaScript in die Seite injizieren und darüber manipulieren. Hat der Angreifer diesen Schritt bewältigt, so fällt das weitere Vorgehen leicht.


    Schritt 2: Cookie manipulieren
    Der Angreifer loggt sich mit irgendeinem beliebigen Account ein. Da jetzt eine Session erstellt wurde, hat der Angreifer in seinem Browser das Cookie mit der Session-ID. Fast jeder moderne Browser erlaubt es, die Cookies einer Website einzusehen und zu verändern. Alles, was der Angreifer tun muss, ist den Inhalt des Cookies mit der in Schritt 1 ermittelten Session-ID zu ersetzen.


    Schritt 3: Los geht's
    Einmal F5 gedrückt und schon ist der Angreifer mit dem Account des Benutzers eingeloggt, weil PHP die Session-ID immer gegen die Daten der zugehörigen Datei linkt. Damit wurde die Identität durch den Angreifer übernommen. Wenn jetzt keine ausreichenden Sicherheitsmaßnahmen von Seiten des Website-Betreibers ergriffen wurden, kann der Angreifer möglicherweise E-Mails im Namen einer fremden Person senden oder den Account löschen.


    Gegenmaßnahmen
    Die folgende kurze Liste zeigt einige wichtige Maßnahmen, die unbedingt beachtet werden sollten:

    • Session-Verwaltung nicht von Außen zugänglich machen
    • Datenbank-Passwörter sicher wählen und regelmäßig ändern
    • SSL-Verschlüsselte Verbindung (HTTPS) einsetzen
    • PHP-Code ausreichend testen und durch andere Entwickler auf mögliche Fehler prüfen lassen
    • Firewall benutzen

    Das ist nur eine kleine Auswahl vieler Sicherheitsmaßnahmen. Über allem sollte ein Webadministrator seine Systeme immer auf dem neusten Stand halten und verantwortungsbewusst handeln. Wer jedem Link folgt, jede Datei ausführt und jede E-Mail öffnet, wird schnell Opfer eines Angreifers. Vorsichtiges, sicherheitsbewusstes Handeln schützt besser als jede Antivirensoftware.



    6 Schluss
    Ich hoffe, dieses Tutorial hat dir einen kleinen Überblick verschaffen und dich etwas über Cookies & Sessions informiert.
    Falls du auch einen praktischen Teil begrüßen würdest, schreib mich einfach an. Bei ausreichend Interesse sind noch mehr Tutorials zu PHP Sessions & Cookies denkbar.


    Ich freue mich über Fragen, Anregungen und Kritik.


    ~ Janhektor

Teilen

Kommentare 1