Cookies

Oftmals ist es sinnvoll, individuelle Details über den Besucher einer Webseite zu speichern. So muss sich ein Online-Shop den Inhalt des Warenkorbs merken können. Diskussionsforen(Wie proggen.org) könnten einen zuvor eingegebenen Benutzernamen speichern und das Eingabefeld für den Namen selbständig ausfüllen. Dazu muss der Besucher eindeutig identifiziert werden. Neben der (Fragwürdigen) möglichkeit, die IP-Adresse mit einem Besucher zu verbinden, kann der Server Textinformationen auf der Festplatte des Besuchers ablegen. Er kann diese cookies bei einem späteren Besuch wieder auslesen.

Cookies sind vor allem für den Besucher sehr praktisch. Webseiten können sich seine bevorzugten Einstellungen merken. Der Online-Versand von Amazon.de verbindet ein Cookie des Besuchers mit den Kundendaten. So kann ein Buch mit einem Mausklick bestellt werden, ohne dass sich der Kunde ein zweites Mal identifizieren muss.

Doch die Kekse schmecken nicht jedem. Sie haben den Ruf, ein Spionageinstrumente zu sein dass aus dem Besucher einen gläsernen Kunden macht. Die Befürchtungen sind weitgehend übertrieben. Wohl kann eine Webseite über Cookies eine Statistik der Häufigkeit von Besuchern und die bevorzugten Seiten ablegen. Querverweise zu anderen Webseiten sind jedoch nicht möglich, bzw. nur über sogenannte „Hooks“ in den jeweiligen Browsern möglich, welche dort eine Schwachstelle besitzen. Dazu gehören aber lange nicht mehr die größeren wie Mozilla's Firefox, Google's Chrome(OpenSource „Chromium“), Opera, Internet Explorer(Obwohl hier ein Hooks über Flashcookies existieren soll(Angeblich)).
Cookies sind Textdateien mit einer Größe von Maximal 4Kbyte. Diese Dateien werden von Webseiten erzeugt und in einem Speziell dafür gedachten Verzeichnis auf der Festplatte des Besuchers gespeichert. Für jede Domain dürfen maximal 20 Cookies(RFC Standard) angelegt werden(Also keine Überlastung der Festplatte, denn 20*4=80Kbyte).

Cookies besitzen meist ein Verfallsdatum. Ist es überschritten, sollte der Browser die Datei löschen. Der Besucher kann die Annahme von Cookies verweigern(Bei den größeren Browsern) oder sie von Hand löschen.

Anwendung von Cookies

Benutzerbewegungen

Statistiken sind von sehr großer Bedeutung. Besonders bei die Betreiber größerer Webseiten mit viel Inhalt interessieren sich für den Weg, den der Besucher einschlägt, sei es nun, weil er nur auf bestimmte Themen fixiert ist oder ihn die Navigation der Internetseite Schwierigkeiten bereitet. Hier können Cookies den Weg des Benutzers »Aufzeichnen«. Jedes mal, wenn der Benutzer eine neue Seite aufruft, werden die Daten seines Cookies in einer Statistik oder Datenbank eingetragen. Der Administrator kann aufgrund dieser Statistik letztlich die Navigation für den Besucher erleichtern, weiß was der Besucher(Im durchschnitt) gerne ließt und kann aufgrund dessen seine Seite angenehmer für den Besucher gestalten.

Benutzeridentifikation

Cookies können den Besuchern das Eingaben von Zugangsdaten für die eigene(!) Webseite abnehmen. Hier sei Vorsicht geboten: Ist der Rechner auch für andere Erreichbar, kann der Zugang missbraucht werden. Wie immer gilt die Regel:„Bequemlichkeit geht auf kosten der Sicherheit!“.

Personalisierte Webseiten

Freust Du dich, wenn Du nach dem morgendlichen Aufstehen auf die Internetseite deiner Tageszeitung surfst und mit deinem Namen begrüßt wirst? Und da Du ein sportlicher Mensch bist, stehen die Sportnachrichten ganz oben auf der Seite. Cookies werden dazu genutzt, um Internetseiten auf den Besucher zuzuschneiden.

Aussehen und Definition von Cookies

Der Server sendet Informationen per HTTP/s an den Client zurück. Ein Teil dieser Information kann vom Client gespeichert werden. In dieser Information sind Daten und eine URL gespeichert. Wird die Internetseite erneut aufgerufen, kann der Client anhand der URL die Daten per HTTP/s an den Server zurückschicken.
Den Befehl, ein Cookie zu erzeugen, gibt der Server im HTTP-Header mit. Durch Set-Cookie (HTTP Format) werden die Daten gespeichert. Im HTTP sieht das so aus:

Set-Cookie: NameDesCookies=InhaltDesCookies; expires=Datum; path=Pfad; domain=DomainName; secure

Einzig und allein der NAME des Cookies muss angegeben werden, alle anderen Angaben sind Optional:

Set-Cookie: CookieName=Inhalt

Mit expires wird das Verfallsdatum gewählt. Verzichtest Du darauf, wird das Cookie nach dem Schließen der Webseite oder nach dem Beenden des Browsers gelöscht. Der Wert selbst ist eine speziell formatierte Datumsangabe:

Wochentag, DD-Mon-YYYY HH:MM:SS GMT

Ein Beispiel könnte so aussehen:

Tuesday, 13-May-2013 08:00:00 GMT

Die Zeitzone GMT(Greenwich Mean Time) ist ein Standard und darf nicht anders angegeben werden.
Durch path wir der Ort der Speicherung des Cookies auf dem Server definiert:

path=/var/www/costumer/proggenorg/cookies

Anhand von domain wird der Browser angewiesen, das Cookie nur an den im Wert enthaltene Domain zurückzuschicken. Auf diese kannst Du ein Cookie für andere Webseiten ins leben rufen. Wir gehen jetzt mal von unserer Domain „Proggen.org“ aus und wollen ein Cookie für status.proggen.org anlegen:

Set-Cookie: Weiter=leiten; domain=status.proggen.org;


Werden sensible Daten gespeichert, so sorgt secure dafür, dass die Cookies nur über eine Sichere Verbindung per SSL übertragen werden, wofür der Webserver dies auch Unterstützen muss. Unter Apache2 wäre es dass Plugin mod_ssl, wo die Daten über den Verschlüsselten Port 443 versendet werden.

Cookies unter PHP

Unter PHP sorgt die Funktion setcookie dafür, dass die Kekse zum Benutzer gesendet werden:

<?php
setcookie($NameDesCookies,$InhaltDesCookies,Verfallsdatum, $Pfad, $Domain, secure)
?>

Diese Cookies werden als Header-Information übertragen(das bedeutet dass es auch möglich ist über header(„Set-Cookie: “); ein Cookie zu erstellen). Aus diesem Grund muss der Aufruf von setcookie vor jeder weiteren Ausgabe von HTML an den Browser erfolgen. Bei vielen Webseiten wird dies durch eine gecachte Ausgabe möglich(Mehr dazu später).
Zwingend erforderlich ist nur der Parameter $Name, alle weiteren sind optional. $Name entspricht hierbei dem Namen des Cookies und Inhalt dem Variablenwert. Du solltest Name wie eine Variable verwenden.
Verfallsdatum gibt an, wie lange das Cookie gültig ist. Es wird als UNIX-Timestamp(Sekunden seit 01.01.1970) codiert. Wird dieser Parameter weggelassen oder NULL(oder 0) übergeben, bleibt das Cookie nur für die gegenwärtige Browsersitzung gültig.


Für ein Cookie, welches ein Tag gültig ist, ermittelst Du den Zeitwert beispielsweise so:

<?php
  $valid = time(); //time ist die Aktuelle Zeit nach dem Unix-Timestamp
  //$Beispiel = $valid + 24 Stunden * 60 Minuten * 60 Sekunden //$Valid ist die Aktuelle Zeit in form eines Unix-Timestamps.
?>

Der Parameter Pfad gibt das Verzeichnis(und damit automatisch dessen Unterverzeichnis) auf dem Server an, für das dass Cookie gültig sein soll. Wird dieser Parameter weggelassen oder ““ übergeben, gilt das Verzeichnis, in dem die PHP-Datei liegt, welche den Cookie erzeugt hat.
Der Parameter Domain bestimmt schließlich, für welche Domain der Cookie gültig ist. Gibt man hier eine andere Domain als die eigene (dort wo es Skript liegt) an, so wird der Cookie aus Sicherheitsgründen meist nicht vom Browser angenommen.
Der Parameter secure bestimmt, ob das Cookie über HTTPS transportiert wird. Alle Daten werden automatisch mit urlencode kodiert und auch wieder in den ursprünglichen Zustand umgewandelt.

Praktische Anwendung

Am besten lässt sich die Funktion eines Cookies anhand einer personalisierten Internetseite demonstrieren. Dazu soll der Benutzer seinen Namen eingeben und eine Lieblings-Schriftart über ein Formular wählen. Zuerst werden für den Fall, dass kein Cookie existiert, Standardinformationen für die Seite bereitgelegt. Diese Daten werden in ein Array gespeichert:


Cookies werden übrigens Standardmäßig in dem Array $_COOKIE gespeichert. Ein Cookie welches den Namen „Hallo“ hat würde also mit der Variable so aufrufbar sein: $_COOKIE["Hallo"].

<?php
  if(!@$_COOKIE["cookieName"])
  {
    $array[] = "Cookie nicht gesetzt!";
    $array[] = "TimesNewRoman";
 

Falls das Cookie bereits gesetzt ist, wird der Inhalt anhand eines Trennzeichens ausgelesen und in ein Array geladen.

      } else {
    $array = explode("@@@",$_COOKIE['cookieName']);
  }

Die nächste Bedingung erzeugt das Cookie, nachdem das Formular abgesendet wurde. Die Daten werden in das Array ''$string geladen, das dann durch ein Trennzeichen in einen String aufgelöst wird. Danach wird das Cookie gesetzt. Um die Lebensdauer zu definieren, wird der Unix-Zeitstempel benutzt und mit 300 Sekunden addiert. Die Lebensdauer des Cookies beschränkt sich also auf fünf Minuten.

  if(@$_POST['set_cookie'] == "yes")
{
  $string = array($_POST['name'], $_POST['font']);
  $string = implode("@@@", $string);
  setcookie("cookieName", $string, time()+300,"","",0);
}
?>

Zum Schluss werden die HTML-Inhalte geschrieben. Die CSS-Definition und die Ausgabe des Namens werden Dynamisch gestaltet. Durch das Formular wird der Inhalt des Cookies definiert.

<html><head><title>Cookie</title>
<style type="text/css">
body { font-familiy:<?php echo $array[1]; ?>; font-size: 14px; }
</style>
</head><body>
Hallo <p style="color: red;"><?php echo $array[0]; ?> !</p>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<input type="hidden" name="set_cookie" value="yes">
Name: <input type="text" name="name" size=15> <br /> <br />
Gew&uuml;nschte Schriftart:
<input type="radio" name="font" Value="Verdena, sans-serif">
<input type="radio" name="font" Value="Tahoma, sans-serif">
<input type="radio" name="font" Value="System, sans-serif">
<input type="submit" Value="Personalisieren!">
</form>
</body></html>

Bitte beachte, dass das Formular zweimal versendet werden muss, damit das Cookie gesetzt wird. Wenn Du die Seite ein drittes Mal aktualisierst, wird der Aktuelle Cookie ausgelesen, und der Inhalt des Dokuments erscheint in der gewünschten Veränderung.