• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Schwierigkeiten beim Loginsystem

fiedel

Mitglied
Hallo,

ich möchte für mich und meine Freunde einen kleinen Bereich erstellen, bei dem jeder einen eigenen Benuzternamen und ein eigenes Passwort hat.
Da dies jedoch ein ganz schön harter Brocken für nen PHP-Anfänger wie mich ist, hab ich mich nach einem Tutorial umgeschaut und wurde fündig: MyWebsolution.de - Workshops - Loginsystem

Doch nun kommt das Problem:
Wenn ich mich auf der Loginseite login.php (nicht über den HTML-Code herfallen, das ist nur ne Testseite, die lediglich den PHP-Code des Tutorials enthält) einlogge, klappt das zwar einwandfrei, doch leider vergisst er das wieder wenn man erneut die Seite aufruft (nicht reloadet, sondern erneut in das Adressfeld eingibt) und man landet wieder bei den Eingabefeldern.


login.php
PHP:
<?php
    error_reporting(E_ALL);

    $MYSQL_HOST = 'localhost';
    $MYSQL_USER = 'zensiert';
    $MYSQL_PASS = 'zensiert';
    $MYSQL_DATA = 'zensiert';

    $connid = @mysql_connect($MYSQL_HOST, $MYSQL_USER, $MYSQL_PASS) OR die("Error: ".mysql_error());
    mysql_select_db($MYSQL_DATA) OR die("Error: ".mysql_error());

    // Session starten
    session_start();
    
        // Prüfen, ob ein Autologin des Users stattfinden muss
    if(isset($_COOKIE['Autologin']) AND !isset($_SESSION['UserID'])){
        $sql = "SELECT
                        ID
                FROM
                        User
                WHERE
                        Autologin = '".mysql_real_escape_string($_COOKIE['Autologin'])."'
               ";
        $result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
        $row = mysql_fetch_assoc($result);
        if(mysql_num_rows($result) == 1)
            doLogin($row['ID'], '1');
    }

    // Online Status der User aktualisieren
    if(isset($_SESSION['UserID'])){
        $sql = "UPDATE
                        User
                SET
                        Letzte_Aktion = '".time()."'
                WHERE
                        ID = '".$_SESSION['UserID']."'
               ";
        mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
    }

    // User ohne Autologin ausloggen
    $sql = "UPDATE
                    User
            SET
                    SessionID = NULL,
                    Autologin = NULL,
                    IP = NULL
            WHERE
                    '".(time()-60*20)."' > Letzte_Aktion AND
                    Autologin IS NULL
           ";
    mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());

    // Kontrollieren, ob ein automatisch ausgeloggter User noch eine gültige Session besitzt
    if(isset($_SESSION['UserID'])){
        $sql = "SELECT
                        SessionID
                FROM
                        User
                WHERE
                        ID = '".$_SESSION['UserID']."'
               ";
        $result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
        $row = mysql_fetch_assoc($result);
        if(!$row['SessionID']){
        $_SESSION = array();
            session_destroy();
        }
    } 

    // Loggt einen User ein, ..
    function doLogin($ID, $Autologin=false)
    {
        // .. indem die aktuelle Session ID in der Datenbank gespeichert wird
        $sql = "UPDATE
                        User
                SET
                        SessionID = '".mysql_real_escape_string(session_id())."',
                        Autologin = NULL,
                        IP = '".$_SERVER['REMOTE_ADDR']."',
                        Letzte_Aktion = '".mysql_real_escape_string(time())."',
                        Letzter_Login = '".mysql_real_escape_string(time())."'
                WHERE
                        ID = '".$ID."'
                ";
        mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
        // Wenn 'eingeloggt bleiben' aktiviert wurde
        if($Autologin){
            // Zufallscode erzeugen
            $part_one = substr(time()-rand(100, 100000),5,10);
            $part_two = substr(time()-rand(100, 100000),-5);
            $Login_ID = md5($part_one.$part_two);
            // Code im Cookie speichern, 10 Jahre dürfte genügen
            setcookie("Autologin", $Login_ID, time()+60*60*24*365*10);
            $sql = "UPDATE
                            User
                    SET
                            Autologin = '".$Login_ID."'
                    WHERE
                            ID = '".$ID."'
                   ";
            mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
        }

        // Daten des Users in der Session speichern
        $sql = "SELECT
                        Nickname
                FROM
                        User
                WHERE
                        ID = '".$ID."'
               ";
        $result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());

        $row = mysql_fetch_assoc($result);
        $_SESSION['UserID'] = $ID;
        $_SESSION['Nickname'] = $row['Nickname'];
    }

    if(isset($_POST['submit']) AND $_POST['submit']=='Einloggen'){
        // Falls der Nickname und das Passwort übereinstimmen..
        $sql = "SELECT
                        ID
                FROM
                        User
                WHERE
                        Nickname = '".mysql_real_escape_string(trim($_POST['Nickname']))."' AND
                        Passwort = '".md5(trim($_POST['Passwort']))."'
               ";
        $result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
        // wird die ID des Users geholt und der User damit eingeloggt
        $row = mysql_fetch_assoc($result);
        // Prüft, ob wirklich genau ein Datensatz gefunden wurde
        if (mysql_num_rows($result)==1){
             doLogin($row['ID'], isset($_POST['Autologin']));
             echo "<h4>Willkommen ".$_SESSION['Nickname']."</h4>\n";
             echo "Sie wurden erfolgreich eingeloggt.<br>\n".
                  "Zur <a href=\"index.php\">Startseite</a>\n";
        }
        else{
             echo "Sie konnten nicht eingeloggt werden.<br>\n".
                  "Nickname oder Passwort fehlerhaft.<br>\n".
                  "Zurück zum <a href=\"".$_SERVER['PHP_SELF']."\">Login-Formular</a>\n";
        }
    }
    else{
        echo "<form ".
             " name=\"Login\" ".
             " action=\"".$_SERVER['PHP_SELF']."\" ".
             " method=\"post\" ".
             " accept-charset=\"ISO-8859-1\">\n";
        echo "Nickname :\n";
        echo "<input type=\"text\" name=\"Nickname\" maxlength=\"32\">\n";
        echo "<br>\n";
        echo "Passwort :\n";
        echo "<input type=\"password\" name=\"Passwort\">\n";
        echo "<br>\n";
        echo "eingeloggt bleiben :\n";
        echo "<input type=\"checkbox\" name=\"Autologin\" value=\"1\">\n";
        echo "<br>\n";
        echo "<input type=\"submit\" name=\"submit\" value=\"Einloggen\">\n";
        echo "<br>\n";
        echo "<a href=\"passwort.php\">Passwort vergessen</a> oder noch nicht <a href=\"registrierung.php\">registriert</a>?\n";
        echo "</form>\n";
    }
?>
EDIT:
Nickname: Test
Passwort: Passwort


Ich denke mal nicht, das das beabsichtigt ist, also muss der Fehler wohl bei mir liegen... :sad:
Ich hoffe, ihr könnt mir wiedermal aus der Patsche helfen!
 
Zuletzt bearbeitet:
Werbung:
Öhm... habe jetzt keine große Lust mir das alles anzuschauen, aber von der Logik her musst du doch einfach nur eine Sessionvariable setzen die signalisiert, dass man eingeloggt ist. Auf der Loginseite muss dann geprüft werden, ob diese Variable existiert. Wenn ja, kannst du über PHP: header - Manual auf eine andere Seite umleiten, z.B. auf eine Profilseite.

Auf allen geschützten Seiten musst du natürlich überprüfen, ob diese Variable gesetzt ist. Wenn nicht, leitest du zurück zum Loginformular.

Gruß
 
Hallo Asipak4You,

ich hab jetzt auch keine Lust mehr mit dem Tutorial weiterzumachen und hab nen neuen Versuch gestartet! :|

Ich lasse den User wie gehabt registrieren und schreibe seine Daten in eine Datenbank.
Auf der Loginseite wird geprüft, ob Passwort und Benutzername zu den Daten in der Datenbank passen.
Wenn "nein": Neuer Versuch. Wenn "ja": 1 Cookie mit dem Benutzername, 1 Cookie mit dem verschlüsselten Passwort und Weiterleitung zur geschützten Seite. Dort inkludiere ich eine Seite, die über die Cookies erneut die Daten überprüfen soll. Passt alles: User bleibt eingeloggt. Passt nicht: Loginformular.

Soweit die Theorie.

Ich bleibe jedoch bei der Datei hängen, die die 2 Cookies mit den Daten in der Datenbank vergleichen soll.

auth.php
PHP:
<?php
     error_reporting(E_ALL);
     $MYSQL_HOST = 'localhost';
     $MYSQL_USER = 'zensiert';
     $MYSQL_PASS = 'zensiert';
     $MYSQL_DATA = 'zensiert';

     $connid = @mysql_connect($MYSQL_HOST, $MYSQL_USER, $MYSQL_PASS) OR die("Error: ".mysql_error());
     mysql_select_db($MYSQL_DATA) OR die("Error: ".mysql_error());

     $hostname = $_SERVER['HTTP_HOST'];
     $path = dirname($_SERVER['PHP_SELF']);

// Bis hierhin klappt alles, doch der Rest erzeugt eine leere Seite,
// selbst wenn ich den Inhalt der if-Klammern rausnehme
     
     if (isset($_COOKIE['u']) && isset($_COOKIE[['p'])) {
      $sql = "SELECT
                        Passwort
                FROM
                        mitglieder
                WHERE
                        Nickname = '".$_COOKIE['u']."'
               ";
      $result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
      
      while ($row = mysql_fetch_assoc($result)) {
       $row["Passwort"];
      }
      
      if ($row['Passwort'] != $_COOKIE[['p']) {
       header('Location: http://'.$hostname.($path == '/' ? '' : $path).'/login.php');
       exit;                            
      }

     }
     
     if (!isset($_COOKIE['u']) || !isset($_COOKIE[['p'])) {
      header('Location: http://'.$hostname.($path == '/' ? '' : $path).'/login.php');
      exit;
     }
?>

Gruß
 
Werbung:
Wieso willst du das ganze eigentlich über Cookies steuern? Ich finde soetwas nicht so gut. Man überlege wenn jemand z.B. im Internetkaffee online geht und plötzlich die Zeit abgeloffen ist und der PC sich ausschaltet. Man hat keine möglichkeit sich auszuloggen und wenn die Cookies gespeichert werden kann der nächste Besucher sich bei dir umschauen...

Anderseits könnte man auch die Gültigkeit von Cookies angeben. Allerdings finde ich das nicht so praktisch.

Bei deinem zweiten Code gehst du in die DB und prüfst, du hast aber unten nur "wenn PW nicht stimmt" und "wenn Username nicht stimmt". wo hast du den include wenn es aber stimmt?!

Gruß
Loon3y
 
Bei deinem zweiten Code gehst du in die DB und prüfst, du hast aber unten nur "wenn PW nicht stimmt" und "wenn Username nicht stimmt". wo hast du den include wenn es aber stimmt?!
Das musst du andersherum betrachten. Ich inkludiere nichts, sondern diese Datei wird inkludiert, und zwar an den Anfang jeder geschützten Seite.

Dass Cookies unsicher sind, leuchtet ein! Ich werde es wohl mit Sessions versuchen müssen! Bei Problemen melde ich mich wieder!
 
Werbung:
Ja, einloggen geht, nur drinnenbleiben nicht! ;) Ich nehme die Testseite jetzt wieder aus dem Netz, hab ja jetzt was eigenes geschrieben! (und das klappt, wie ihr merkt, bis jetzt problemlos)
 
Zurück
Oben