Sessions: 2 Fragen

  • PHP

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von viperkill.

    Sessions: 2 Fragen

    Hallo,

    gleich vorab: Ich habe vor 3 Tagen erst mit PHP angefangen also seid gnädig ;D Ich weiß, dass diese Fragen schon oft gestellt wurden aber dazu kursieren auch verschiedene Antworten im Netz. Jetzt zu meinen Fragen:

    1. Ist es egal an welcher Stelle im PHP-Code ich eine Session starte ? Habe gelesen, dass es in der ersten Zeile gemacht werden muss oder dass sie vor allen echo ausgaben gestartet werden muss

    2. Ich habe mehrere Funktionen in meinem PHP-Projekt(ist ein Loginsystem), indem ich bei einem geglücktem Login-Versuch eine neue Session erstelle. Muss ich jetzt in jeder Funktion in der Session-Spezifische Daten genutzt werden vorab einmal "session_start();" ausführen ? Habe bisher "bugs" bekommen wenn ich das nicht gemacht habe(ich wurde automatisch ausgeloggt wenn auf Unterseiten geprüft wurde ob die session gesetz wurde). Kommt mir aber komisch vor das jedesmal machen zu müssen

    3. Wie gesagt erstelle ich bei einem erfolgreichen Login eine Session. Die ID dieser Session wird dann in einer MySQL-Tabelle gespeichert. Auf jeder Seite wird dann geprüft ob 1. Der User überhaupt eine offene Session hat und 2. Wenn er eine offene Session hat, wird die lokale PHPSESSID mit der Session-ID auf dem MySQL-Server verglichen. Sind sie unterschiedlich wird der Benutzer ausgeloggt. Vielleicht schwer zu beantworten, aber ist dieses System einigermaßen sicher ?


    Danke für eure Antworten!

    Grüße
    1. session_start in die erste Zeile! Bevor überhaubt etwas kommt

    2. Einmal reicht auch wenn deine funktionen aus anderen php dateien includet sind

    3. Meiner Meinung nach würde es sogar reichen nur eine eineinmalige Session id dem Nutzer für diesen Login zuzuweisen diese auch in der session speichern und über diese den Nutzer zu identifizieren.


    MFG
    Danke für eine Antworten!

    Was stimmt denn nun ? Vor irgendwelchen ausgaben (bsp. "echo") oder die erste Zeile nach "<?php" ? Mir wäre es ganz recht wenn es nur vor echo-Ausgaben stehen muss ;D

    Zu 2: Danke, habe meinen Denkfehler dadurch gefunden.
    Das "Problem" mit den Sessions ist nun auch beseitigt. Allerdings stehe ich jetzt vor dem nächsten Problem:

    Ich habe eine Funktion("authRoutine") die auf jeder Seite ausgeführt wird auf der gesperrter Content zu sehen ist(also ein Login wird benötigt). Diese Routine prüft zuerst ob in der Session eine `userID` vorhanden ist, falls ja wird weiter die Korrektheit des Logins geprüft, falls die `userID` nicht vorhanden ist, wird man auf die index Seite weiter geleitet. Allerdings werde ich immer auf die index Seite umgeleitet obwohl der Login eigentlich korrekt ist. In der Session-Datei auf dem Server ist auch die `userID` gesetzt. Trotzdem kann ich mich nicht sichtbar anmelden(der MySQL-Server sieht mich als Eingeloggt an).

    Hier mal der Code der authRoutine(hoffentlich ausreichend Kommentiert):

    Spoiler anzeigen

    PHP-Quellcode

    1. function authRoutine() {
    2. // Ist in der Session noch die userID vorhanden ?
    3. if(isset($_SESSION['userID'])) {
    4. // last_action vom Server holen wo die ID(DB)=userID(session) und die sessionID(DB)=sessionID(session) ist
    5. $sql = "SELECT last_action FROM User WHERE ID='".$_SESSION['userID']."' AND sessionID='".session_id()."'";
    6. $result = mysql_query($sql) OR die("An MySQL-Error occurred:<pre>\n".$sql."</pre>\n".mysql_error());
    7. $row = mysql_fetch_assoc($result);
    8. // last_action hat ein Ergebnis ?
    9. if (mysql_num_rows($result)==1) {
    10. $last_action = $row['last_action'];
    11. // Wenn last_action größer ist als time - 20 Mins bleib eingeloggt.
    12. if((time()-60*20) < $last_action) {
    13. // last_action in DB auf aktuelle Uhrzeit setzen
    14. $sql2 = "UPDATE User SET last_action='".time()."' WHERE ID='".$_SESSION['userID']."'";
    15. mysql_query($sql2) OR die("An MySQL-Error occurred:<pre>\n".$sql2."</pre>\n".mysql_error());
    16. // Prüfen ob index.php aktuelles Dokument ist, wenn ja dann Location: view.php
    17. if(endsWith($_SERVER['SELF_PHP'],"index.php")) {
    18. header ("Location: view.php");
    19. }
    20. } else {
    21. // last_action länger als 20 Minuten her, also ausloggen
    22. doLogout(2);
    23. }
    24. } else {
    25. // ausloggen weil userID oder sessionID nicht gültig!
    26. doLogout(3);
    27. }
    28. } else {
    29. // userID nicht gesetzt. Prüfen ob auf gesperrten Content ohne Login zugegriffen wird und ggf. umleiten
    30. if(!endsWith($_SERVER['PHP_SELF'],"index.php")) {
    31. header ("Location: index.php");
    32. }
    33. }
    34. }
    35. // Prüft ob ein String mit einem anderem String endet
    36. function endsWith($fullStr,$endStr) {
    37. $strLen = strlen($endStr);
    38. $fulStrEnd = substr($fullStr,strlen($fullStr) - $strLen);
    39. return $fulStrEnd == $endStr;
    40. }


    In Zeile 33 wird geprüft ob das aktuelle Dokument(dieses PHP-Script wird von der Seite included auf der geprüft wird, ob der Login akzeptiert wird) ungleich index.php ist. Ist es ungleich index.php heißt das, dass der User versucht hat auf gesperrte Seiten zuzugreifen und wird dann auf die index.php zurück geleitet.


    Sieht jemand von euch den Fehler in diesem Script ?


    Grüße


    Edit: Problem gelöst. Mal wieder ein Flüchtigkeitsfehler der dann auch noch die ganze Zeit übersehen wurde :cursing:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „viperkill“ ()