Schwierigkeiten beim Loginsystem

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 [SIZE=1](nicht über den HTML-Code herfallen, das ist nur ne Testseite, die lediglich den PHP-Code des Tutorials enthält)[/SIZE] einlogge, klappt das zwar einwandfrei, doch leider vergisst er das wieder wenn man erneut die Seite aufruft [SIZE=1](nicht reloadet, sondern erneut in das Adressfeld eingibt)[/SIZE] 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";
}

?> [/PHP]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!

Ö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! :expressionless:

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("
\n".$sql."
\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; } ?>

[/PHP]

Gruß

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!

Ich habe gerade versucht mich mit den angegebenen Daten einzuloggen und es hat funktioniert!

Ja, einloggen geht, nur drinnenbleiben nicht! :wink: Ich nehme die Testseite jetzt wieder aus dem Netz, hab ja jetzt was eigenes geschrieben! (und das klappt, wie ihr merkt, bis jetzt problemlos)