# 4.8 Cookies & Sessions

HTTP ist ein zustandsloses Protokoll. Somit hat der Server keine Informationen darüber, welche Anfragen ein Client bereits zuvor durchgeführt hat. Um "Zustände" irgendwie "zwischenspeichern" zu können, werden Cookies und Sessions genutzt.

## Cookies

Für das Setzen von Cookies gibt es die Funktion setcookie ("Name", "Inhalt", Verfallsdatum, "Pfad", "Domain", secure).

Diese Funktion sendet einen mit HTTP Header-Informationen zu übertragenden Cookie. Dies muss vor der Ausgabe des Scripts geschehen, also vor dem eigentlichen HTTP-Body. Schlägt `setcookie()` fehl, wird `false` zurückgegeben, bei Erfolg `true`. Dies allerdings ist keine Aussage darüber, ob der User den Cookie akzeptiert hat oder nicht.

Als Beispiel wird hier wieder das Formular verwendet, welches nach einem Vor- und Nachnamen fragt.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    <?php
    /**
     * Beispiel Formular - Cookies
     * @author Jörg Thomaschewski
     * @date 04.04.2024
     */

    function writeHeaderAndHeadline()
    {
        echo "<!DOCTYPE html>
              <html lang=\"de\">
              <head><title>Cookies</title>
              </head>
              <body>
              <h1>Beispiel Cookies</h1>";
    }

    function startForm($method, $url)
    {
        echo "<form method=\"$method\" action=\"$url\">";
    }

    function writeInputField($text, $name)
    {
        echo "<label for=\"$name\">$text: </label>
              <input type=\"text\" name=\"$name\" id=\"$name\">
              <br><br>";
    }

    function closeForm()
    {
        echo "<input type=\"submit\" value=\"Formular abschicken\">
              </form>";
    }

    function closeFooter()
    {
        echo "</body></html>";
    }

    // Beginn des Hauptprogramms
    writeHeaderAndHeadline();
    startForm("post", "test.php");
    writeInputField("Vorname", "vorname");
    writeInputField("Name", "nachname");
    closeForm();

    if (!empty($_POST)) {
        // Speichern der Daten als Cookies
        setcookie("vorname",  $_POST["vorname"]);
        setcookie("nachname", $_POST["nachname"]);

        // Ausgabe der POST-Daten
        echo '<br>Ihr Browser übermittelte folgende Daten im $_POST<br>';
        echo "Vorname:",  $_POST["vorname"], "<br>";
        echo "Nachname:",  $_POST["nachname"], "<br>";
    }

    // Ausgabe der gespeicherten Cookie-Daten
    if (isset($_COOKIE["vorname"]) && isset($_COOKIE["nachname"])) {
        echo "<br>Ihr Browser lieferte folgende Cookie-Daten <br>";
        echo "Vorname: " . $_COOKIE["vorname"] . "<br>";
        echo "Name: " . $_COOKIE["nachname"];

    } else {
        echo "<br>Es wurde noch kein Cookie übertragen. <br>
        Beim ersten Aufruf der Seite wird das Formular erzeugt. <br>
        Dann füllen Sie Daten aus und schicken diese zu Server. <br>
        Der Server verarbeitet die Daten und schickt diese zurück und setzt einen Cookie. <br>
        Erst beim erneuten Senden schicken Sie den Cookie mit, der dann angezeigt wird. <br>";
    }

    closeFooter();
    ?>

Die Prozedur kann beliebig oft wiederholt werden, da das Cookie im Browser immer wieder automatisch überschrieben wird.

## Sessions

Die Verwendung von Sessions bietet sich immer dann an, wenn Daten über mehrere Webaufrufe hinweg transportiert werden müssen, beispielsweise um Formulardaten auch auf den nachfolgenden Seiten auswerten zu können oder damit die Login-Daten auf mehreren Seiten zur Verfügung stehen. Auf einer ersten Seite wird eine Session gestartet, die dann entsprechende Parameter an alle folgenden Seiten übergibt.

Funktion | Beschreibung
--- | ---
session_start() | Initialisiert eine Session oder nimmt die aktuelle wieder auf (Funktion gibt immer `true` zurück)
session_destroy() | Logout – löscht also alle registrierten Daten
session_name() | Liefert den Session-Namen
session_id() | Setzt und liefert die aktuelle Session-ID
session_encode() | Kodiert die aktuellen Session-Daten als Zeichenkette
session_decode() | Dekodiert Session-Daten aus der Zeichenkette

Das Zulassen von Sessions ohne Session-Cookies stellt ein Sicherheitsrisiko dar. URLs mit Session-ID können in Browsercaches gefunden und missbraucht werden.

Beispiel

Das Beispiel zeigt, wie mittels einer Session Informationen auf dem Server gespeichert und abgerufen werden können.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    <?php
        session_start();
        echo "Der letzte Reload war am: ";
        if (empty($_SESSION["zeit"])) {
            echo "Noch nie!";
        } else {
            echo date("d.m.Y H:i:s", $_SESSION["zeit"]) . " Uhr";
        }
        echo "<br>Warten Sie kurz und drücken Sie dann die F5-Taste!";
        $_SESSION["zeit"] = time();
    ?>

Bei dem ersten Aufruf ist noch kein Datum hinterlegt, weshalb der Text „Noch nie!“ angezeigt wird. Ausgabe:

> Der letzte Reload war am: Noch nie!
> Warten Sie kurz und drücken Sie dann die F5-Taste!

Erst nach einer Aktualisierung der Website erscheint das Datum. Ausgabe:

> Der letzte Reload war am: 26.08.2019 17:52:34
> Warten Sie kurz und drücken Sie dann die F5-Taste!