2009-11-23 14 views
6

Ich habe ein Benutzerobjekt, das Informationen über den Benutzer enthält (Benutzername, IP, Land, Name, E-Mail ... aber kein Passwort). Soll ich nur den Benutzernamen im Cookie speichern und dann beim Laden der Seite alle Informationen aus der Datenbank abrufen oder einfach das gesamte Benutzerobjekt im Cookie speichern?Ist es sicher, Benutzerobjekt in einem Cookie zu speichern?

Antwort

16

Sie können keiner in einem Cookie gespeicherten Information vertrauen, da der Benutzer sie in seiner Freizeit manipulieren kann.

Ich schlage vor, mit einem PHP session das Objekt zu speichern. Auf diese Weise hat der Endbenutzer nur eine Sitzungs-ID in einem Cookie gespeichert, mit den echten Daten auf Ihrem Server.

Die Sitzung wird schließlich auslaufen, obwohl ... sich der Benutzer erneut anmelden muss.

Edit: Whoops, ich sollte darauf hinweisen, dass Sitzungen wirklich einfach zu bedienen sind. Mach einfach folgendes:

session_start(); // This MUST be at the very top of every page that accesses the session 

// Store something in the session with the key 'something' 
$_SESSION['something'] = "Hi, I'm a session!"; 

// Retrieve 'something' from the session 
$myString = $_SESSION['something']; 
+7

+1 für 'Sie können Daten in Cookies nicht vertrauen.' Um den Punkt von R. Bemrose zu erweitern, sollten Cookies einen Zeiger auf Daten in Ihrem System enthalten, nichts weiter. Auf diese Weise sind die Cookie-Daten selbst bedeutungslos. –

+0

Auch die Weitergabe großer Datenmengen in einem Cookie kann sich negativ auf die Seitenladezeiten auswirken, da der Cookie bei jeder Anfrage übergeben wird. – Yacoby

+0

Oder es könnte einen positiven Effekt auf die Seitenladezeiten haben, da es Ihnen ermöglicht, einen Datenbank-Round-Trip zu vermeiden. Das weißt du nur durch Messen. :) – Thom

0

Für diesen Fall würde ich sagen, speichern Sie die Benutzer-ID in den Cookie und das ist es. Dann laden Sie beim ersten Laden der Seite alles, was Sie benötigen, aus der Datenbank und fahren fort, eine Sitzung zu verwenden, solange der Benutzer auf Ihrer Seite bleibt.

Um zu testen, ob die Seite das erste Mal geladen wird, lege ich einfach eine Bool in der Sitzung, wenn es geladen wurde. Wenn der Bool nicht existiert, lädt Ihr Benutzer ihn zuerst.

Es gibt wahrscheinlich bessere Möglichkeiten, dies zu tun, aber es funktioniert gut und einfach. :)

1

Die Standardregel von 'niemals vertrauenswürdigen Daten' gilt auch für Cookies. Ich schlage vor, nur die Benutzer-ID sowie einen Hash der ID und ein Geheimnis zu speichern, das nur dem Server bekannt ist.

0

Nur eine Sitzungs-ID speichern! Niemals aussagekräftige Daten wie Benutzer-ID. Stellen Sie sich vor, Sie haben eine Site mit 10.000 Benutzern. Wahrscheinlich haben Sie mindestens einen Benutzer namens superman und batman - wenn Sie einen Benutzernamen in einem Cookie rauben, um auf Ihre Sitzungsinformationen zuzugreifen - ist es möglicherweise möglich, diesen Cookie zu manipulieren, um gespeicherte Informationen von meinem Benutzernamen zu batman zu ändern und Zugang zu erhalten Batmans Konto, wenn seine Sitzung noch am Leben ist. Wenn Sie eine Art von zufällig generierter Sitzungs-ID speichern, ist es für mich ziemlich unmöglich, eine Sitzungsnummer herauszufinden, die einem anderen Benutzer helfen könnte, diese Sitzung zu übernehmen.

0

Sie können Informationen im Cookie vertrauen, wenn Sie etwas wie Hmac verwenden. Benutzer könnten immer noch die Daten sehen, aber Sie würden wissen, ob sie es manipuliert hatten (zum Beispiel, ihren Benutzernamen zu jemandes anderen zu ändern, um die Daten eines anderen Benutzers zu sehen). Wenn Sie nicht möchten, dass die Daten angezeigt werden, können Sie die gesendeten Daten auch symetrisch verschlüsseln. Offensichtlich gibt es einen CPU-Overhead für all das und einen Bandbreiten-Overhead, je mehr Kram man hineinpackt, aber es ist völlig legitim, das zu tun, was man verlangt.

0

@ ApoY2k - Ich denke, die Down-Abstimmung (war ich nicht :) war, weil Sie nicht annehmen können, dass der Benutzername von einem Cookie ist der tatsächliche Benutzername, den Sie an den Cookie geschrieben haben. Aus diesem Grund haben sie vorgeschlagen, die SessionID zu verwenden. Mit der SessionID können Sie den Benutzernamen holen und wie er sagte, ist es nur gut für 20 Minuten oder was auch immer Sie Ihr Session-Timeout setzen. SessionID zeigt keine privaten Daten an. Ich hatte jedoch denselben Gedanken, bevor ich diesen Beitrag gefunden habe.

Verwandte Themen