Eine Einführung zu Cookies

Sie haben vielleicht von Cookies gehört, aber was genau sind sie und was können wir eigentlich mit ihnen machen? In diesem Tutorial konzentrieren wir uns auf die Grundlagen von Cookies und lernen deren Funktionalität in verschiedenen Webanwendungen und Websiteumgebungen kennen. Wir lernen auch, wie Sie sie in unseren PHP- und JavaScript-Projekten verwenden können, und achten dabei besonders auf mögliche Sicherheitsprobleme. Nach dem Lesen haben Sie die erforderlichen Fähigkeiten erworben, um Cookies sicher in Ihre eigenen Webanwendungen zu implementieren.


Schritt 1. Cookies verstehen

Der erste Schritt auf unserer Reise besteht darin, herauszufinden, was diese Cookies eigentlich sind! Auch wenn Sie bereits mit ihnen gearbeitet haben, kann dieser Teil dennoch nützlich sein - bleiben Sie also bei mir!

Abstrakt

Cookies können am einfachsten als Textdateien betrachtet werden, die auf Ihrem Computer gespeichert werden. Auf Anforderung eines Webservers erstellt Ihr Browser eine solche Datei. Danach kann der Webserver Inhalte aus und in diese Datei lesen und schreiben. Obwohl dies als eine gefährliche Funktion erscheint - niemand mag es, dass andere Leute Dateien auf ihren Computer schreiben, es gibt jedoch einige Einschränkungen, um diesen Prozess so sicher wie möglich zu gestalten.

  • Webserver können nur auf Cookies zugreifen, die auf ihre eigene Domain gesetzt sind. Diese Domäne wird vom Browser festgelegt, wenn ein neuer Cookie vom Webserver angefordert wird, und kann nur die Domäne oder eine Unterdomäne des Webservers sein (der Webserver kann eine Unterdomäne auswählen, wenn er möchte). Dies bedeutet, dass Cookies, die beispielsweise von google.com gesetzt wurden, nicht von mozilla.com gelesen werden können und umgekehrt.
  • Gemäß dem HTTP-Protokoll dürfen Cookies nicht größer als 4096 Bytes (4 KB) sein.
  • Die Anzahl der Cookies pro Domain ist begrenzt. Die Anzahl unterscheidet sich je nach Browser, das allgemein verwendete Limit liegt jedoch bei 20 Cookies. Dadurch wird verhindert, dass eine einzelne Domäne den Speicherplatz des Clients belastet.
  • Die Gesamtzahl der Cookies auf der Festplatte des Clients ist begrenzt. Diese Anzahl unterscheidet sich auch je nach Browser, ist jedoch normalerweise auf etwa dreihundert Cookies beschränkt. Wenn diese Anzahl überschritten wird, wird ein älterer Cookie gelöscht, bevor ein neuer erstellt wird.

Cookies haben ein Ablaufdatum. Dieses Datum ist so eingestellt, dass der Browser alte Cookies löschen kann, wenn sie vom Webserver nicht mehr benötigt werden. Wenn das Ablaufdatum leer ist, wird das Cookie gelöscht, wenn die Verbindung zum Server geschlossen wird. Dies geschieht, wenn das Fenster oder die Registerkarte der Site vom Benutzer geschlossen wird oder wenn der Benutzer den gesamten Browser schließt. Diese Cookies, manchmal auch Sitzungs-Cookies genannt, werden hauptsächlich zum Speichern temporärer Einstellungen verwendet.

Technisch

Lassen Sie uns herausfinden, wie diese Dinge auf technischer Ebene aussehen. Cookies werden über das HTTP-Protokoll übertragen. Dieses Protokoll wird von Browsern verwendet, um Dateien abzurufen und an den Server zu senden. Nachdem ein Cookie angefordert wurde, wird es jedes Mal an den Server gesendet, wenn ein neuer Artikel auf der Webseite vom Browser abgerufen wird. Unten sehen Sie einen Ausschnitt eines Servers, der ein neues Cookie anfordert (dieser Ausschnitt ist Teil einer HTTP-Antwort)..

 Set-Cookie: Name = Inhaltsdaten; verfällt = Fri, 31-Dec-2010 23:59:59 GMT; Pfad = /; domain = .example.net

Jetzt keine Angst haben, es ist alles sehr verständlich!

  • Set-Cookie: soll dem Browser mitteilen, dass der Server ein neues Cookie erstellen möchte.
  • Name ist der Name des Cookies. Jeder Cookie in einer Domain muss einen anderen Namen haben, damit der Browser alle Cookies voneinander trennen kann. Nach dem Namen kommt das = Inhaltsdaten wobei 'Inhaltsdaten' die Daten sind, die in dem Cookie enthalten sein sollen. Diese Daten können eine Textzeichenfolge oder eine Zahl sein und, wie gesagt, bis zu 4 KB groß sein.
  • verfällt = ist der Befehl für das Ablaufdatum. Das Ablaufdatum ist im Format "Wdy, DD-Mo-JJJJ HH: MM: SS GMT" angegeben (fragen Sie mich nicht, warum es für dieses lächerliche Format definiert wurde, da ich es auch nicht weiß. Kein Benutzer sieht das Verfallsdatum, warum also Speicherplatz, Festplattenspeicher und Bandbreite für lange Daten verschwenden?). Machen Sie sich jedoch keine Sorgen, denn die meisten Programmiersprachen verfügen über einfach zu verwendende Funktionen. Der Browser löscht Cookies automatisch mit einem Ablaufdatum in der Vergangenheit.
  • Das Domain und Pfad eine tiefere Erklärung erfordern. Das Domain ist die Domäne, in der der Cookie aktiv ist. Wenn die Domain "ads.google.com" ist, wird das Cookie nur an den Server dieser Domain gesendet. Wenn die Domain "google.com" ist, wird das Cookie an einen Server einer der Unterdomänen von gesendet Google, einschließlich google.com selbst.
  • Das Pfad ist der Pfad der Domain, an die der Cookie gesendet wird. Das heißt, wenn der Pfad auf "/ images /" und die Domain auf "ads.google.com" gesetzt ist, wird der Cookie nur an den Server gesendet, wenn der Browser eine Datei von "ads.google" anfordert .com / images / '. Wenn der Pfad auf '/' gesetzt ist, wird das Cookie unabhängig vom Ort der angeforderten Datei auf dem Server an den Server gesendet.

Im nächsten Schritt überprüfen wir, wie diese Eigenschaften in Programmiersprachen verwendet werden können.


Schritt 2. So erstellen und lesen Sie Cookies

Cookies können auf verschiedene Arten erstellt werden. In diesem Lernprogramm werden wir uns jedoch auf PHP und JavaScript konzentrieren.

PHP

Das Wichtigste beim Erstellen eines Cookies in PHP ist, dass Sie alle Cookies setzen müssen bevor Sie Daten an den Browser senden. Dies bedeutet, dass Sie sollten immer neue Cookies initialisieren Vor jede Ausgabe. Dazu gehören die Befehle echo () oder print () und die oder Stichworte. Natürlich gibt es einige Ausnahmen, aber dies ist eine allgemeine Faustregel.

 … // geht der gesamte Inhalt usw. hier?>

Dies sollte inzwischen bekannt sein, außer für $ sicher und $ httponly. Das 'Sichere' besteht darin, das Cookie nur dann zu senden, wenn eine HTTPS-Verbindung hergestellt wurde, wenn es auf true gesetzt ist und normalerweise auf false gesetzt ist. Das "httponly" macht das Cookie nur über das HTTP-Protokoll verfügbar. Dies bedeutet, dass clientseitige Sprachen wie JavaScript und VBscript nicht auf das Cookie zugreifen können. Dies hilft, böse Dinge wie Cross Site Scripting zu vermeiden und sollte auf true gesetzt werden, wenn Sie nicht die Absicht haben, die Cookies mit einer Sprache wie JavaScript clientseitig zu bearbeiten. Um Missverständnissen vorzubeugen, bedeutet "httponly" nicht, dass Cookies nicht über HTTPS gesendet werden können, da sie dies immer noch können. Beachten Sie jedoch, dass das obige Snippet etwas kleiner gemacht werden kann (und sollte):

 

Großartig! Jetzt können wir Cookies erstellen, aber wir müssen sie auch lesen können. Glücklicherweise macht PHP dies sehr einfach, wenn bereits ein Cookie erstellt wurde. In PHP gibt es eine Umgebungsvariable namens $ _COOKIE [], mit der der Wert des Cookies ermittelt werden kann. Um es zu benutzen, füge einfach den Namen des Cookies in die Klammern [] ein:

 

Diese Umgebungsvariable kann wie jede andere verwendet werden. Genau wie $ _GET [] und $ _POST [] kann sie direkt als normale Variable behandelt werden (wenn Sie einmal geprüft haben, ob der Cookie tatsächlich existiert), wenn Sie möchten.

Wenn Sie das Ablaufdatum, den Pfad oder die Domäne ändern möchten, müssen Sie einen vorhandenen Cookie mit setcookie () überschreiben, wobei derselbe Name wie beim ursprünglichen Cookie verwendet wird. Wenn Sie das Ablaufdatum in der Vergangenheit ändern (z. B. time () - 30 * 60), wird der Cookie gelöscht.

JavaScript

Cookies können auch clientseitig gelesen und geschrieben werden. Auch wenn JavaScript keine gute Lösung zum Lesen und Schreiben von Cookies bietet, ist es möglich und weit verbreitet. JavaScript verwendet das document.cookie-Objekt für die Cookie-Bearbeitung, wie im folgenden Snippet gezeigt:

 // Aktuelles Datum abrufen var abgelaufen = neues Datum (); // Datum um 5 Stunden verlängern abgelaufen.setHours (abgelaufen.getHours () + 5); document.cookie = 'cookiename = cookievalue; expires = "+ expiredate.toUTCString () +" path = / example /; domain = test.envato.com ';

Wie Sie vielleicht bemerkt haben, ähnelt diese Syntax der HTTP-Protokollnotation. Dies hat den Vorteil einer besseren Kontrolle, bringt jedoch auch einige potenzielle Probleme mit sich. Unten ist der Schnipsel zum Lesen eines Kekses.

 var cookieName = 'Testcookiename'; var textArray = document.cookie.split (';'); // füge alle Teile des Strings in einem Array für (var i = 0; i < textArray.length; i++) // loop though all string pieces var textPiece = textArray[i]; //contains 1 string piece //filter beginning spaces while(textPiece(0)==") textPiece = textPiece.substring(1,textPiece.length); //if the textpiece contains our cookies name if (textPiece.indexOf(cookieName)== 0) //return whats after the cookies name return textPiece.substring(cookieName.length,c.length);  

Ich weiß, ich weiß; das ist ein schmerz. Zum Glück für euch, ich schreibe ein paar vorab geschriebene Funktionen (vielleicht möchten Sie Ihre eigenen Funktionen zu Lernzwecken erstellen, und das sollten Sie auch!).

 Funktion writeCookie (cookieName, cookieValue, expireHours, Pfad, Domäne) var date = new Date (); date.setHours (date.getHours + expireHours); document.cookie = cookiename + '=' + cookieValue + '; verfällt = "+ Datum +"; Pfad = "+ Pfad +"; domain = "+ domain; Funktion readCookie (cookieName) var textArray = document.cookie.split ("; '); für (var i = 0; i < textArray.length; i++) var textPiece = textArray[i]; while(textPiece(0)==") textPiece = textPiece.substring(1,textPiece.length); if (textPiece.indexOf(cookieName)== 0) return textPiece.substring(cookieName.length,c.length);  

Bitte beachten Sie, dass diese Ausschnitte keine Fehlerprüfung enthalten.


Schritt 3. Was ist mit Cookies zu tun?

Wusstest du? -
Cookies wurden von Netscape erfunden, die sie zur Erstellung eines Warenkorbs für einen Online-Shop verwenden wollten. Dank Cookies konnten die Leute ihren Artikel auch nach dem Trennen der Verbindung behalten.

Heutzutage verwenden wir Cookies für fast jeden Zweck, den Sie sich vorstellen können. Sie können sie zum Speichern von Benutzereinstellungen wie Name, Sprache, Ort oder Bildschirmgröße verwenden. Dies kann die Qualität des Dienstes verbessern, den Sie für einen Kunden bereitstellen möchten, da Sie den Dienst für einen Kunden optimieren und sich an diese Optimierung in der Zukunft erinnern können. Sie können beispielsweise die bevorzugte Sprache des Kunden in einem Cookie speichern und anschließend den Inhalt Ihrer Website bei jedem Besuch Ihrer Website in der bevorzugten Sprache anzeigen.

Natürlich gibt es mit Keksen viel mehr Spaß als mit diesem! Im nächsten Schritt zeige ich Ihnen ein Beispiel für ein cooles Code-Snippet.


Schritt 4. Cooles Zeug schreiben

Endlich! Jetzt können wir anfangen, fantastischen Code zu schreiben! Nachfolgend finden Sie ein Bonus-Snippet, das Cookies verwendet, um einen Relogin-Mechanismus zu erstellen.

Anmelde-Snippet "Erinnere dich an mich"

Bevor wir beginnen, enthält dieses Snippet etwas MySQL-Code. Wenn Sie sich mit MySQL nicht auskennen, geraten Sie nicht in Panik. Obwohl dieses Snippet etwas schwierig ist, sollte es mit ein wenig PHP- und Cookie-Grundkenntnissen verständlich sein.

Um eine Implementierung der "Erinnerung an mich" zu erstellen, müssen wir ein paar Dinge haben. Erstens benötigen wir eine Datenbanktabelle, die einen Benutzernamen, ein Kennwort und ein Identifikationsfeld enthält. Zweitens benötigen wir eine eindeutige Zeichenfolge oder Nummer, um Clients sicher durch Cookies zu identifizieren (dies ist die Identifikation in der Datenbanktabelle). In diesem Snippet verwenden wir einen SHA-1-Digest, der nur eine Zeichenfolge ist, als Bezeichner. Bei bestimmungsgemäßer Verwendung bietet dies hervorragende Sicherheit.

Die meisten Benutzer geben einfach einen Benutzernamen und ein Passwort in das Cookie ein und senden es automatisch an den Server. Dies sollte zu jeder Zeit vermieden werden! Cookies werden normalerweise über eine nicht sichere Verbindung gesendet, sodass der Inhalt von potenziellen Angreifern leicht gesehen werden kann.

 Nutzername; // Hier sollten Sie einen neuen Digest für das nächste Relogin mit dem obigen Code einstellen! echo 'Sie haben sich erfolgreich angemeldet.' $ username;  else // Digest existierte nicht (oder es wurden mehrere Digests gefunden, aber das wird nicht passieren) echo "Anmeldung fehlgeschlagen!"; ?>

Bei Verwendung eines Digests wie wir, sind die Chancen, zwei gleiche Digests zu erhalten, winzig. Ein Digest ist eine vierzig Zeichenfolge, die theoretisch immer eine vollständige Zufallsausgabe bereitstellen sollte, wenn die Eingabe geändert wird. In der Praxis sollten Sie dem serverseitigen Code ein Zeitlimit hinzufügen, damit der Digest nach X Minuten nicht gültig ist. Dadurch wird verhindert, dass Angreifer die Cookies von Personen kopieren und zum Anmelden verwenden.


Schritt 5. Best Practices

Wir sind fast am Ende dieses Tutorials angelangt. Zum Abschluss möchte ich einige Best Practices zusammenfassen:

  • Fügen Sie niemals vertrauliche Daten in ein Cookie ein. Ein Client kann auf einem öffentlichen Computer surfen. Lassen Sie also keine persönlichen Informationen zurück.
  • Vertrauen Sie niemals auf Daten, die von Cookies stammen. Strings und Zahlen immer filtern! Ein Angreifer könnte bösartige Daten in das Cookie schreiben, um etwas zu tun, das der Dienst nicht tun soll.
  • Versuchen Sie zu schätzen, wie lange das Cookie gültig sein soll, und legen Sie das Ablaufdatum entsprechend fest. Sie möchten den Computer des Kunden nicht mit alten Cookies belasten, die in hundert Jahren ablaufen.
  • Stellen Sie immer "sicher" und "httponly" ein, um Ihre Anwendungsanforderungen zu erfüllen. Wenn Ihre Anwendung die Cookies nicht mit JavaScript bearbeitet, aktivieren Sie httponly. Wenn Sie immer eine HTTPS-Verbindung haben, aktivieren Sie sicher. Dies verbessert die Integrität und Vertraulichkeit der Daten.

Fazit

Ich hoffe, Sie haben aus dem heutigen Nettuts + Tutorial etwas gelernt. Wenn Sie Fragen haben, können Sie einen Kommentar hinterlassen oder auf Twitter Hallo sagen.