$_session oder doch lieber Cookie?

Hi Leute,

ich stehe gerade davor ein eigenes kleines CMS zu erstellen. Jetzt stehe ich vor der Entscheidung: Sessions oder Cookies zur Benutzerauthentifizierung?
Was meint ihr?

Mit freundlichen Grüßen

Amityville

SESSIONS auf jeden Fall…bau aber sicherheitshalber noch eine IP-Sperre ein, die folgendermaßen wirkt:

Beim Login wird die IP in der SESSION gespeichert…

und bei jedem Aufruf wird die IP überprüft:

if($_SESSION["IP"] != $_SERVER["REMOTE_ADDR"])
   logout();

so in etwa…

Für was ist diese IP-Sperre gut?

dass niemand die session “klauen” kann.
man könnte mit get die session-id an die URL anhängen und so eine session übernehmen.

und speichert $_Session nicht in Cookies?

Also wäre die Frage nicht, Session mit Cookie oder Datenbank?

Das speichert auf der Festplatte, es wird aber u.U. ein Cookie gesetzt in dem die ID der Session steht.

wusste doch da war was^^

hm, dann werd ich gleich nochmal googlen

ich geb dir einen überblick:
anfangen tut der Code immer mit

Dieser Befehl lädt die aktuelle Session-ID wenn vorhanden, ansonsten kreiert es eine neue (Hier wird auch das Cookie gesetzt)
Danach hast du Zugriff auf das Array $_SESSION

beim Login etwa…
und beim nächsten Aufruf ist dieses Array immer noch gleich…

if(!empty($_SESSION["username"]))
   echo "Willkommen";
else
   exit header('Location: login.php');

Wichtig: Sessions sind nur begrenzte Zeit verfügbar :wink:

Kurze Frage: Was spricht gegen die tollen Kekse?

Bisher habe ich das immer mit Cookies gemacht, weil ich das mit den Sessions nie hinbekommen habe :frowning:

Weil jeder user Cookies beliebig abändern kann, mit JavaScript jedes Cookie ausgelesen werden kann, und Cookies nicht von Browser zu Browser übertragen werden können…außerdem gibt es mit Cookies uU. Probleme mit manchen Browsern, die das Cookie einfach nicht akzeptieren (MSIE)

Außerdem ist es unsicher, wenn du Logindaten einfach so im Cookie speichert. Wenn es jemandem gelingt, das Cookie z. B. mit XSS zu stehlen, dann hätte dieser Jemand das Passwort im Klartext.

Also ein richtig großes Sicherheitsrisiko. Okay, das möchte ich natürlich nicht haben (da werde ich wohl nicht der einzige sein)!

Und wie funktioniert das da nun mit dem Einloggen? Bisher ist es so, dass ich auf “Einloggen” klicke und dann der Benutzername mit der Datenbank verglichen wird, anschließend das Passwort und wenn alles stimmt, dann setze ich die Cookies und führe “header(“Location.index.php”);” aus. Wie mache ich das nun mit Sessions? Kennt ihr vielleicht gute Links zu Seiten, in denen das ganz einfach beschrieben wird und nicht mit Unmengen komplexem PHP-Code?

PS: Ich hatte das Password gar nicht abgespeichert (und im Klartext sowieso niemals!). Aber gerade jetzt merke ich, dass es dadurch umso einfacher wäre an einen andern Account ranzukommen! Nicht gut.

Die Usernamen und PWs speicherst du in einer Textdatei, oder in einer Datenbank (die PWs MD5-Verschlüsselt)

Registrierung: Speicherung des BN und des verschlüsselten PWs
zB: in einer DB

Login: Vergleich des eingegebenen Passworts mit dem gespeicherten
zB: aus der DB

$sql=mysql_query("SELECT `pass` FROM `users` WHERE `user` = '$user' ") OR die(mysql_error());

if(!$sql=mysql_fetch_row($sql))
   exit header("Location: index.html");  //Login fehlgeschlagen

if($sql[0] && md5($pass) ==  $sql[0])
{
   $_SESSION["user"]=$user;
   $_SESSION["ip"]=$_SERVER["REMOTE_ADDR"];
}
else
   header("Location: index.html");  //Login fehlgeschlagen

dann brauchst du nur noch überprüfen, ob $_SESSION[“user”] gesetzt ist, und ob $_SESSION[“ip”] mit der IP übereinstimmt…logout geht einfach über Löschen von $_SESSION[“user”]

war zwar ein recht umfangreiches Beispiel (für dich), aber
1.) brauchbar
2.) wird in etwa so wirklich verwendet

Okay, vielen Dank. Gerade noch das “session_start();” davor gesetzt und schon bleibt mir die Session erhalten.

Noch eine Frage:
Da es bestimmte Funktionen nur für Benutzer einer bestimmten Gruppe gibt, dachte ich mir, dass ich die Gruppe auch in die Session schreiben lasse, also $_SESSION[‘group’]=“user”;.
Oder gibt es da auch Möglichkeiten etwas zu manipulieren? Ansonsten müsste ich jedesmal eine Anfrage an die Datenbank senden und überprüfen lassen, ob der Benutzer in der entsprechenden Gruppe ist. Ich würde solche Anfragen aber lieber minimieren.

wie weit bist du mit PHP? Wenn du ein wenig weiter bist, würde ich dir da eine Klasse empfehlen :wink:

class user
{
   private $user;
   private $group;

   public function login($user, $pass)
   {
      $sql="SELECT `pass`, `group` FROM `users` WHERE `user` = '$user'";
      if(!$sql) return false;

      $sql=mysql_fetch_assoc($sql);
      if($sql["pass"] != md5($pass))
             return false;
      $this->group=$sql["group"];
      $this->user=$user;
      return true;
   }
   public function get_group() { return $this->group; }
   public function get_user()  { return $this->user; }
}

Von dieser Klasse kannst du ein Objekt erzeugen, und direkt das in der Session speichern :wink:
Es liegt an dir um welche Funktionen du das noch erweiterst (IP-Sperre, PW-Änderung, Register, …)

Wenn du aber wirklich mit einer DB arbeitest, solltest du wissen, wie das überhaupt geht :wink:

Also ehrlich gesagt bin im PHP überhaupt nicht weit. Grundwissen von PHP habe ich (Arbeit mit PHP und MySQL geht auch), aber mit Klassen habe ich noch nicht gearbeitet, jedoch mit Funktionen. Leider sieht es so aus, dass bisher bei den Funktionen immer wieder Datenbankanfragen gesendet werden, was aber wirklich nicht sein muss, dass ich den Server mit (wahrscheinlich) unnützen Anfragen bombardiere. Mit einer Klasse könnte ich zumindest alles, was ich brauche, in Variablen speichern und dann abrufen.

Aber eigentlich müsste ich das mit den Klassen doch auch hinkriegen! Danke erstmal.

PS: Mir ist eben aufgefallen, dass die Session nur für den aktuellen Ordner verfügbar ist? Also unter “keco.bplaced.net/login.php” erstelle ich die Session und kann sie aber unter “keco.bplaced.net/sub/index.php” nicht auslesen? Lässt sich da irgendwas machen?

doch…die Session ist unter der selben Domain überall erreichbar :wink:
hast du session_start() vergessen?

Das mit der Klasse ist zwar mehr Arbeit, zahlt sich aber auf jeden Fall aus :wink:

Vergessen hatte ich es nicht, aber das mit dem live-updaten wollte nicht so ganz funktionieren. Das heißt, dass die geänderten Dateien nicht hochgeladen wurden…

Jetzt funktioniert es soweit.

Wie mache ich das?
$_SESSION[‘sqlobj’] = ???;

Und wie würde ich in deinem Code an (beispielsweise) die Gruppe rankommen?
So: $_SESSION[‘sqlobj’].get_group()

du machst das so:

$user = new user;

//Login:
if(!$user->login("michi", "7x7"))
   die("Anmeldung schlug fehl!");

//Gruppe holen
if($user->get_group() != "admins")
   die("Keine Berechtigungen!");

//In Session speichern
$_SESSION["user"]=$user;

PS: Du hast schon mit einer anderen Programmiersprache gearbeitet…

Wer hätte aber gedacht, dass es in PHP doch so ähnlich ist…

Gut, vielen Dank für deine Zeit. :slight_smile: