PHP Session Fragen eines Neulings

  • Ersteller Ersteller derBobby
  • Erstellt am Erstellt am
D

derBobby

Gast
Hallo zusammen,

ich gehe gerade mehrere Tutorials durch, um möglichst viel Informationen aus diesen zu ziehen. Ein paar Fragen sind bis jetzt aber offen geblieben! :)

Zum Beenden einer Session muss das Session Array geleert und die Session zerstört werden:
Code:
setcookie(session_name(), "", time()-3600);
$_SESSION = array();
session_destroy();

1.) Ich habe gelesen, dass setcookie vor jeder Ausgabe in einem Skript stehen muss. Wie soll ich dann aber am Ende eines Skriptes das Cookie löschen? Dies wird ja benötigt bei nicht eingeloggten Usern, denen man eine Session geben möchte.

2.) Kann man die Befehle zum beenden einer Session in ein weiteres Skript auslagern, das man aus mehreren Dateien heraus ausrufen kann?

3.) Ist "session.use_only_cookies = 1" die sicherste Methode, um eine Session laufen zu lassen?

Danke und liebe Grüße
ein lernender Bobby
 
1. setcookie nutzt man heute nicht mehr. Dafür gibts $_COOKIE. Um Session Cookies musst du dich nicht kümmern, die werden automatisch erzeugt. Wenn du die Session startest, wird dieser automatisch erstellt, wenn die Session zerstört wird, wird eben ein neues Cookie beim nächsten Aufruf erzeugt.

2. So wie du willst.

3. Ist sowieso PHP Standard.
 
1. setcookie nutzt man heute nicht mehr. Dafür gibts $_COOKIE. Um Session Cookies musst du dich nicht kümmern, die werden automatisch erzeugt. Wenn du die Session startest, wird dieser automatisch erstellt, wenn die Session zerstört wird, wird eben ein neues Cookie beim nächsten Aufruf erzeugt.
Aber wenn ich ein Cookie löschen/leeren will, nachdem sich ein Benutzer ausgeloggt hat, dann muss ich das ja auch irgendwie machen?

3. Ist sowieso PHP Standard.
Bei mir war standardmäßig 0 eingetragen!:
Code:
session.use_only_cookies = 0
 
Zuletzt bearbeitet von einem Moderator:
derBobby schrieb:
Aber wenn ich ein Cookie löschen/leeren will, nachdem sich ein Benutzer ausgeloggt hat, dann muss ich das ja auch irgendwie machen?
Wenn du jemanden ausloggen willst, musst du die Session zerstören. Um das zu tun, wird gerne auch der Session-Cookie gelöscht. Das machst du mit setcookie().

Cookies werden grundsätzlich durch Setzen von HTTP-Headern erstellt. Diese stehen IMMER vor dem eigentlichen Content, der übertragen wird (z.B. dein HTML-Code). Deswegen muss setcookie() auch vor jeder Ausgabe aufgerufen werden.

Grundsätzlich wird Logik von Ausgabe daher getrennt. Du machst erst deine ganze Logik, Berechnungen, Bedingungen, Schleifen, setcookie, andere Header etc. und gibst ERST DANN Sachen aus (z.B. per HTML). Leider wird sich bei den vielen grottigen PHP-Tutorials selten daran gehalten und die Sprache fördert generell Bad Practices wie keine andere.

derBobby schrieb:
Bei mir war Standardmäßig 0 eingetragen!
Standard ist aber 1 und das ist auch sinnvoll.

Edit: Rechtschreibung.
 
Zuletzt bearbeitet:
setcookie braucht man doch wirklich nur, wenn man weitergehende Eigenschaften dem Cookie übergeben will. Für 95 % der Fälle reicht $_COOKIE vollkommen aus. Ein unset( $_COOKIE['xyz'] ) macht doch genau das Gleiche.
 
Seit wann kann man durch Verändern des $_COOKIE-Arrays Cookies senden bzw. löschen? What black magic is this?
 
Zuletzt bearbeitet:
Das machst du mit setcookie().
Es braucht also keine Parameter, oder ist das doch okay wie ich es im ersten Post habe?

Cookies werden grundsätzlich durch Setzen von HTTP-Headern erstellt. Diese stehen IMMER vor dem eigentlichen Content, der übertragen wird (z.B. dein HTML-Code). Deswegen muss setcookie() auch vor jeder Ausgabe aufgerufen werden.
Wie kann ich dann aber mit setcookie das alte Cookie nach dem Logout "zerstören"? Das klingt gerade etwas paradox, da ja vorher auf jeden Fall Ausgaben gemacht werden?

Leider wird sich bei den vielen grottigen PHP-Tutorials selten daran gehalten und die Sprache fördert generell Bad Practices wie keine andere.
Sind dir gute Tutorials bekannt? Denn wenn ich es lerne, dann würde ich Best Practices bevorzugen! :)
 
derBobby schrieb:
Es braucht also keine Parameter, oder ist das doch okay wie ich es im ersten Post habe?
Doch mit Parametern und deine Version sieht ok aus, wobei ich je nach Setup path und domain noch mit angeben würde.

derBobby schrieb:
Wie kann ich dann aber mit setcookie das alte Cookie nach dem Logout "zerstören"? Das klingt gerade etwas paradox, da ja vorher auf jeden Fall Ausgaben gemacht werden?
Dein Logout könnte z.B. so funktionieren, dass der User einen Link mit ?action=logout aufruft. In deinem Script reagierst du nun auf $_GET['action'] == 'logout'. In diesem Fall wird die Session zerstört, der Cookie gelöscht (mit setcookie) und danach dein HTML ausgegeben ("Logout erfolgreich").

Das war jetzt natürlich nur ein Beispiel.

derBobby schrieb:
Sind dir gute Tutorials bekannt? Denn wenn ich es lerne, dann würde ich Best Practices bevorzugen! :)
Spontan nicht ehrlich gesagt. Wenn du schon eine andere Sprache kennst, werden dir aber einige Dinge auffallen.
 
Ich habe in einem anderen "Forum" das, was Yuuri behauptet hat, auch noch mal als Behauptung gefunden. Leider keine Quelle:
http://phpforum.de/forum/showthread.php?t=177043

Okay, das habe ich jetzt alles verstanden. Danke character! Da kommt mir aber die nächste Frage: Als weitere Möglichkeit die Sicherheit zu erhöhen kann man wohl die Session ID bei jedem neuen Seitenaufruf erneuern:
Code:
session_regenerate_id()
Lässt sich dieses auch damit kombinieren, dass man nur Cookies verwendet?
 
Eigentlich macht man das nur beim Login/Logout, nicht bei jedem Seitenaufruf. Generell funktioniert das aber auch mit Cookies, ja.

Besser finde ich es, beim Login/Logout die jeweils alte Session komplett zu zerstören. Das hängt aber (wie so oft) auch vom konkreten Anwendungsfall ab.
 
Das lässt sich doch dann aber beides machen? Bei jedem Seitenaufruf die ID ändern und beim Logout dann Session zerstören und Cookie löschen?

Gilt in dem Fall nicht "viel hilft viel", zumindest in punkto Sicherheit?
 
@Yuuri: Ich wüsste nicht, dass sich je etwas an setcookie() geändert haben sollte?!

Es hat sich auch nicht wirklich etwas geändert, es sind nur Superglobals implementiert worden. Nun muss man nicht mehr die lange Geschichte "$_REQUEST" benutzen, sondern man kann ganz einfach mit $_COOKIE arbeiten.

@derBobby: Um einen Cookie zu löschen, kannst du Dir entweder eine Funktion/Abfrage dazu bauen (Wenn Gast auf Logout drückt, dann wird über diese Funktion der Cookie gelöscht) oder du lässt den Cookie einfach per Zeitangabe ablaufen.

Per Zeitangabe:
PHP:
setcookie ("1", "2", 3);
// 1. Parameter: Dem Cookie einen Namen geben
// 2. Parameter: Cookie Inhalt (Keine sensiblen Daten wie Passwörter drin speichern, da diese in plain Text auf dem Gastrechner gespeichert werden)
// 3. Parameter: Aktuelle Zeit per time() ermitteln - Zeit in Sekunden, wann der Cookie ablaufen soll

Beispiel:
PHP:
setcookie("derbobby_cookie", "cookie_inhalt", time() - 3600);
Per Abfrage:

PHP:
if (isset($_COOKIE['derbobby_cookie'])) {
    $cookies = explode(';', $_COOKIE['derbobby_cookie']);
    foreach($cookies as $cookie) {
        $parts = explode('=', $cookie);
        $name = trim($parts[0]);
        setcookie($name, '', time()-1000);
        setcookie($name, '', time()-1000, '/');
    }
}
 
Zuletzt bearbeitet:
derBobby schrieb:
Das lässt sich doch dann aber beides machen? Bei jedem Seitenaufruf die ID ändern und beim Logout dann Session zerstören und Cookie löschen?

Gilt in dem Fall nicht "viel hilft viel", zumindest in punkto Sicherheit?
Ich glaube nicht, dass es schadet, aber ich bezweifle auch, dass es viel bringt.

Ohne SSL hast du theoretisch immer ein Risiko, da hilft auch eine neue Session-ID nicht viel. Ein Angreifer kann die Session-ID abfangen und selbst eine neue Anfrage stellen. Er bekommt dann die neue ID und der echte User wird halt ausgeloggt, weil seine Session-ID nicht mehr stimmt. Die Session hat nun trotzdem der Angreifer übernommen.

Aber in der Praxis? Wie wahrscheinlich ist das? Und wieso würde man auf solche Details achten, aber kein SSL verwenden?

Viel wichtiger finde ich, dass die Session-ID nicht im Query-String landet. Aber das ist ja schon mit session.use_only_cookies abgestellt.
 
PHP:
if (isset($_COOKIE['derbobby_cookie'])) {
    $cookies = explode(';', $_COOKIE['derbobby_cookie']); //$_COOKIE nach Array zerlegen 
    foreach($cookies as $cookie) { //Über Array-Elemente iterieren
        $parts = explode('=', $cookie); //Elemente nach Array zerlegen
        $name = trim($parts[0]); //?
        setcookie($name, '', time()-1000); //?
        setcookie($name, '', time()-1000, '/'); //?
    }
}
Kannst du das mal durchkommentieren? Bin mir nicht sicher, was die mit //? kommentierten genau bedeutet :/

Aber in der Praxis? Wie wahrscheinlich ist das? Und wieso würde man auf solche Details achten, aber kein SSL verwenden?
SSL kostet halt! :-)

Viel wichtiger finde ich, dass die Session-ID nicht im Query-String landet. Aber das ist ja schon mit session.use_only_cookies abgestellt.
Dann funktionieren Sessions ohne Cookies aber auf keinen Fall, nehme ich an?
 
Kannst du mir deine paar Zeilen Code noch erklären, bei denen ich //? kommentiert habe?
 
PHP:
setcookie($name, '', time()-1000); //?
setcookie($name, '', time()-1000, '/'); //?

Im setcookie(); hast du die Möglichkeit einen Pfad anzugeben. Mit den beiden setcookies (oben) stellst du sicher, dass er jeden Pfad nach dem von Dir gesuchten Cookie absucht und ihn dann löscht.
 
Kommt immer darauf an, ob und welchen Pfad du bei der Cookieerstellung angegeben hast! Wenn du Dein Beispiel vom ersten Post nutzt, dann kannst du das "/" auch weglassen.

Ich würde beide drin lassen, dann bist du auf der sicheren Seite, dass der Cookie auch wirklich gelöscht wird. Nimmt keine extra Ressourcen in Anspruch.
 
Zurück
Oben