Verständnisfrage zu Login und Sessions
Frank Fischer
- php
Hallo,
ich habe einen Bereich in meiner Seite, den der Nutzer nur sehen darf, wenn er sich einloggt.
Ich habe also ein Login gebaut und nach erfolgreichem Login bekommt der Nutzer eine Session-Id. Jetzt darf er sich also die gesperrten Inhalte anschauen.
Nun aber mein Problem.
Wie kann ich beim Aufruf jeder Seite, die im gesperrten Bereich liegt überprüfen, ob derjenige, der die Seite aufruft überhaupt eingeloggt ist ? Wie kann ich die Gültigkeit der Session-Id auf den gesperrten Seiten überprüfen ? Mir fehlt da irgendwie das Verständnis zu Sessions, obwohl ich schon sämtliche FAQs ... durchgelesen habe. :-(
Danke
ff
HAlloa,
gibt dem User einfach den Variable mit auf den Weg:
$_SESSION[eingeloggt]=true;
Auf die Var kannst Du dann immer zurückgreifen:
if ($_SESSION[eingeloggt]!=true)header("LOCATION: http://www.domain.de/login.php");
An die Anderen:
Warum soll man $_SESSION verwenden und nich session_register("session")???
Greets Tom1tk
Hello,
gibt dem User einfach den Variable mit auf den Weg:
$_SESSION[eingeloggt]=true;
Und wenn Du ihm
$_SESSION[logcheck] = time();
bibst, dann könntest Du auch vor dem Aktualisieren dieser Variable fragen, wie lange der User schon nicht mehr geklickt hat. Wen es dann zu lange her war, dann kannst Du ihn automatisch ausloggen.
Außerdem stehen die Userrechte bestimmt in einer Datenbank. Man wird nicht drum herum kommen, bei jedem Request dort nachzuscheun, wie die Rechte stehen. Wenn sie sich in den letzten dreizehn Tagen, seitdem sich der User angemeldet hat und ständig für traffic gesorgt hat, nämlich geändert haben, sollten sie ja schließlich auch effektiv werden. Und wenn es erst 0,5sec her ist, auch.
Liebe Grüße aus http://www.braunschweig.de
Tom
Hallo,
$_SESSION[eingeloggt]=true;
^^ ^^
$_SESSION[logcheck] = time();
^^ ^^
Also bitte, Tom, _das_ haette ich nicht von Dir erwartet.
Dass Du es ihm durchgehen laesst, ist eine Sache.
Dass Du es aber selbst schreibst, kann ich fast nicht glauben! ;-)
Warum ist $foo[bar] falsch?
http://www.php.net/manual/de/language.types.array.php#language.types.array.foo-bar
Wichtige Ausnahme: Innerhalb von doppelten Anfuehrungszeichen:
http://www.php.net/manual/en/language.types.string.php#language.types.string.parsing.simple
http://www.php.net/manual/en/language.types.string.php#AEN3609
Korrekt: echo "Blabla $foo[bar] Blabla";
Korrekt: echo "Blabla {$foo['bar']} Blabla";
Falsch: echo "Blabla $foo['bar'] Blabla";
Gruesse,
Thomas
Hallo Thomas'e (=Namenskollegen)!
Warum sollte man denn überhaupt $_SESSION verwenden? Ist diese Var automatisch reserviert bei session_start(), oder muss ich dier erst session_register(_SESSION)??
Greets Tom1tk
Hello Tom & Thomas,
Warum sollte man denn überhaupt $_SESSION verwenden? Ist diese Var automatisch reserviert bei session_start(), oder muss ich dier erst session_register(_SESSION)??
Ja, das sollte man scho erklären. Es handelt sich um eins der redervierten Arrays. Dieses wird bei session_start() automatisch angelegt. Leider wird auch noch $HTTP_SESSION_VARS angelegt bei PHP 4. Erst ab PHP 5 kann man diese unnütze Doublette abschalten.
Beim Session-Start werden automatisch die Session-Variablen in die beiden Arrays geladen. Die haben ab dann nichts mehr miteinander zu tun. Deshalb sollte man gleich nach session_start() ein unset($HTTP_SESSION_VARS) absetzen, allerdings aus dem Namensraum, in dem session_start() ausgeführt wurde.
@Thomas L.
Das war doch nur Pseudo-Code. Ich hab schon wunde Finger, wenn ich den ganzen Tag soviel Häkchen toppen muss... ;-))
Liebe Grüße aus http://www.braunschweig.de
Tom
Hallo nochmals,
streikt php eigentlich, wenn man globals=on hat, dann
global $_SESSION;
setzen will?
Ich hab grad meine Seite auf $_SESSION umgebaut und von früher noch global $_SESSION dranstehen gehabt. Das gab nen Fehler aus.
Kann ich dennoch überall auf $_SESSION zugreifen? Auch in Funktionen?
Thanx Tom1tk
Hello,
streikt php eigentlich, wenn man globals=on hat, dann
global $_SESSION;
setzen will?
Version?
Also, $_SESSION sollte bereits superglobal und damit auch global sein.
Mit $HTTP_SESSION_VARS gabs immer noch Probleme, wenn man die Session in einer Funktion gestartet hatte. Da musste man vorher die Vars im hauptpraogramm als Glonal deklarieren und dan in der Funktion bestätigen.
Aber mit $_SESSION sind diese Probleme beseitigt.
Man kann ja auch
$HTTP_SESSION_VARS = &$_SESSION;
schreiben. Damit sind die alten Session-Vars platt und sind fortan nur eine Kopie von $_SESSION. Damit müssten sie auch superglobal sein. habe ich aber noch nicht probiert.
Liebe Grüße aus http://www.braunschweig.de
Tom
Hi Tom,
Version: 4.2.3 und globals sind on (kann ich auch nicht ändern) Zur Sicherheit initialisiere ich immer alle (sicherheitsrelevanten) Vars neu:
z.B. $logincheck="";
$passwort=$_SESSSION["logincheck"];
Ist das hier korrekt mit ["Gänsefüßle"]??
Ist das sicher? Oder kann man über bla.php?_SESSION[logincheck]=xyz das System knacken?
Wie kann ich das unterbinden?
Greets nach Braunschweig,
Tom1tk
Hello,
Hi Tom,
Version: 4.2.3 und globals sind on (kann ich auch nicht ändern) Zur Sicherheit initialisiere ich immer alle (sicherheitsrelevanten) Vars neu:
Wieso kannst Du das nicht ändern?
Das lässt sich doch für jeden virtual Host separat einstellen.
Und dann würde ich mal langsam einen fähigen Praktikanten (m/w) dransetzen, die das in den Scripten repariert. Ist eine wunderbare Verständnisprüfung und leider auch eine Fleißarbeit.
Liebe Grüße aus http://www.braunschweig.de
Tom
Hello,
Hi Tom,
Version: 4.2.3 und globals sind on (kann ich auch nicht ändern) Zur Sicherheit initialisiere ich immer alle (sicherheitsrelevanten) Vars neu:
Wieso kannst Du das nicht ändern?
Das lässt sich doch für jeden virtual Host separat einstellen.
Lieber Tom
Nicht jeder User hat einen eignen Server mit vielleicht sogar Root Zugriff.
Und ein Massenhoster wird Dir was husten wenn Du von Ihm verlangst das auf deinem virtuelleh Host umzustellen.
Viele Grüße aus Berlin
Hello,
Lieber Tom
Nicht jeder User hat einen eignen Server mit vielleicht sogar Root Zugriff.
Und ein Massenhoster wird Dir was husten wenn Du von Ihm verlangst das auf deinem virtuelleh Host umzustellen.
Dann mach er es sich doch selber mit einer .htaccess-Datei. Und wenn er das nicht darf, wechsele er endlich den Provider *gg*
Es gibt wirklich guten Serveice schon für 15Euro im Monat und da kann man dann einstellen und Einrichten, was einem gefällt.
Liebe Grüße aus http://www.braunschweig.de
Tom
Guten Abend TomLuethi
Hallo,
$_SESSION[eingeloggt]=true;
^^ ^^
$_SESSION[logcheck] = time();
^^ ^^
Also bitte, Tom, _das_ haette ich nicht von Dir erwartet.
Dass Du es ihm durchgehen laesst, ist eine Sache.
Dass Du es aber selbst schreibst, kann ich fast nicht glauben! ;-)
Ähm, entweder habe ich was flasch verstanden oder ?
Hier kopie von php.net:
Zeile1: echo "Schlecht: " . $array['$i'] . "\n";
Zeile2: echo "Gut: " . $array[$i] . "\n";
Zeile3: echo "Schlecht: {$array['$i']}\n";
Zeile4: echo "Gut: {$array[$i]}\n";
Wie schreibt man dann ein Wertzuweisung?
$array[$i]=time();
oder
$array['$i']=time();
So wie ich das verstehe ist Zeile 1 schlecht, oder?? Also ist die Lösung vom TomBraunschweig schon OK. Oder?
Danke für Aufklärung über das Mysterium "Array"!
Greets Tom1tk
Hallo Tom,
Hier kopie von php.net:
Deine untenstehenden Beispiele haben _Variablennamen_ als Schluessel.
Was ich angemeckert hatte, waren konkrete _Strings_ als Schluessel.
Und _die_ muessen in Anfuehrungszeichen stehen, weil sie sonst
(als Fallback, schlecht, aber funktionierend) als Konstanten betrachtet werden.
Das steht alles auch auf der von Dir zitierten Seite. Bitte genau lesen!
http://www.php.net/manual/de/language.types.array.php#language.types.array.foo-bar
Vorbemerkung: Im Beispiel hat die Variable $i den Inhalt 0 oder 1, also eine Zahl.
Es koennte geradesogut ein String sein.
(PHP unterscheidet bei Schluesseln nicht zwischen Zahlen und Strings; man kann
auch bunt mischen, wenn man will. Uebersichtlich ist das aber nicht...)
Zeile1: echo "Schlecht: " . $array['$i'] . "\n";
Ja, schlecht, weil hier der _Variablenname_ in _einfachen_
Anfuehrungszeichen steht und somit nicht interpretiert wird.
Der Schluessel waere hier der String $i (Dollar, i),
und fuer diesen Schluessel enthaelt der Array keinen Inhalt,
was auch zur angegebenen Fehlermeldung fuehrt:
"Undefined index: $i"
Zeile2: echo "Gut: " . $array[$i] . "\n";
Ja, die Anfuehrungszeichen sind nicht notwendig,
denn Du setzt den Variablennamen ein, und somit ist
der Schluessel dann den Inhalt der Variable, hier die Zahl 1.
Zeile3: echo "Schlecht: {$array['$i']}\n";
Ja, siehe oben.
Zwischen den geschweiften Klammern gilt das gleiche
wie _ausserhalb_ der doppelten Anfuehrungszeichen...
Zeile4: echo "Gut: {$array[$i]}\n";
Ja, siehe oben.
$array[$i]=time();
$array['$i']=time();So wie ich das verstehe ist Zeile 1 schlecht, oder??
Nein, gerade nicht. Zeile 1 ist gut, Zeile 2 ist schlecht.
Zur Wiederholung und Klarstellung:
Zahl als Schluessel:
$meinarray[1] ist gut.
$meinarray['1'] ist gut.
$meinarray["1"] ist gut.
String als Schluessel:
$meinarray[bla] ist schlecht.
$meinarray['bla'] ist gut.
$meinarray["bla"] ist gut.
Variablenname als Schluessel:
Voraussetzung: Die Variable $variablenname enthaelt eine Ganzzahl (Integer) oder einen String
$meinarray[$variablenname] ist gut
$meinarray['$variablenname'] ist schlecht
(ausser man meint den String $i als Schluessel, aber nicht zu empfehlen...)
$meinarray["$variablenname"] funktioniert und ist IMHO OK
(weil die Variable zwischen den doppelten Anfuehrungszeichen interpretiert wird)
Siehe auch: Variablen-Analyse (parsing) in Strings:
http://www.php.net/manual/en/language.types.string.php#language.types.string.parsing
Gruesse,
Thomas
Hallo,
Sorry, winzige Korrektur:
$meinarray['$variablenname'] ist schlecht
(ausser man meint den String $i als Schluessel, aber nicht zu empfehlen...)
sollte natuerlich heissen:
... (ausser man meint den String $variablenname als Schluessel
mfg, Thomas
Vielen Dank.
Das war mal ne richtige Erklärung (auch so, dass ich es verstanden habe!)
Vielen Dank
Tom1tk
Hello,
Hello,
gibt dem User einfach den Variable mit auf den Weg:
$_SESSION[eingeloggt]=true;
Und wenn Du ihm
$_SESSION[logcheck] = time();
Also, das muss:
$_SESSION['logcheck'] = time(); oder ggf. auch noch
$_SESSION["logcheck"] = time(); heißem.
Die zweite Variante ist wharscheinlich langsamer, da der Parder erst noch auf Variablenauflösung schielen muss. Gerade, wenn man Arrays rekursiv oder in Schleifen füllt, dann könnte das schon ein paar Microsecunden kostren *gg*
Liebe Grüße aus http://www.braunschweig.de
Tom