1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Problem mit Login/Logout (Sessions)

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von newmacuser24, 14.02.08.

  1. newmacuser24

    newmacuser24 Antonowka

    Dabei seit:
    27.12.05
    Beiträge:
    355
    Hallo zusammen,

    Bin bei der Suche nach einem sicheren Login-Script auf folgenden Link gestossen:
    http://forums.devarticles.com/progr...-creating-a-secure-php-login-script-3033.html

    Bevor ich Änderungen vorgenommen habe, habe ich das Script erstmal so ausprobiert, wie es dort gepostet wurde. Funktionieren tut es einwandfrei mit einer kleinen Ausnahme:
    Wenn ich mich mit Hilfe des Scripts einlogge und dann wieder auslogge kann ich mit der Browser-Taste "Zurück" wieder in den Account hinein. Logout erfüllt also nicht den Zweck, den es soll. Also hab ich mir gedacht, es würde reichen die Funktion logout() durch ein session_destroy(); zu ergänzen. Gebracht hat es leider nichts.

    Gibt es vielleicht einen generellen Trick, wie man das mit der "Zurück"-Taste in den Griff bekommt?

    Vielen Dank im Voraus!

    Ach ja...Um ein Einlesen in das Beispielscript leichter zu machen, hier eine kleine Zusammenfassung. Die Login/Logout Prozedur besteht aus 3 Teilen: 1) member_class.php - hier sind die ganzen Funktionen zu login/logout, check, ob die session aktiv ist, etc... definiert. Mit Hilfe dieser Funktionen wird zum Beispiel eine Session ID, ein Token erstellt, bzw. die IP-Adresse des Benutzers geloggt. 2) db_connect.php - einfaches 3-Zeilen Script, dass die Verbindung zur MySQL-Datenbank herstellt. 3) whatever.php - das ist das Hauptscript, dass die verschiedenen Formulare zum Login/Logout, etc...bereitstellt.
     
  2. Dadelu

    Dadelu Reinette Coulon

    Dabei seit:
    06.07.05
    Beiträge:
    939
    Also prinzipiell sollte es mit einem session_destroy() funktionieren, dass du nicht einfach zurück klicken kannst.

    Aber vieleicht ist irgendwo ein kleiner Codier - Fehler drinnen?

    Kannst du mal den Code posten, wo du den Befehl anwendest?

    Gruss
     
  3. drok

    drok Klarapfel

    Dabei seit:
    02.06.07
    Beiträge:
    278
    Kannst du denn dann auch Sachen verändern wenn du den "Zurück"-Button betätigt hast ?
     
  4. zeno

    zeno Lane's Prinz Albert

    Dabei seit:
    05.11.05
    Beiträge:
    4.898
    gaaaaaaaanz oben rein:
    header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
    header ("Last-Modified: ".gmdate ("D, d M Y H:i:s")." GMT");
    header ("Cache-Control: no-cache, must-revalidate");
    header ("Pragma: no-cache");
     
  5. newmacuser24

    newmacuser24 Antonowka

    Dabei seit:
    27.12.05
    Beiträge:
    355
    Also, hier das komplette Script:

    member_class.php - Definition der Funktionen:

    <?php
    // member class
    // handlers member logon
    class member_class {
    var $message = '';
    var $query_error = 'ERROR: something went wrong when accessing the database. Please consult your webmaster';

    function member_class() { //constructor
    if (!isset($_SESSION['uid'])) { //fills session with empty values
    $this->set_session_defaults();
    }

    if ($_SESSION['logged_in']) { //already logged in
    $this->check_session();
    }

    if (isset($_COOKIE['remember'])) {
    $this->check_remembered($_COOKIE['remember']);
    }
    }

    function register($username,$password,$remember) {
    $username = mysql_escape_string($username);
    $password = mysql_escape_string(md5($password));

    $result=mysql_fetch_array(mysql_query("SELECT * FROM member WHERE username = '{$username}'"), MYSQL_ASSOC);
    if (!$result) { //insert record if user name doesn't exist
    $insert = mysql_query("INSERT INTO member VALUES ('', '$username', '$password', '', '', '')") or DIE ($this->query_error);
    $result = mysql_fetch_array(mysql_query("SELECT * FROM member WHERE username = '{$username}' AND password = '{$password}'"), MYSQL_ASSOC) or DIE ($this->query_error);
    $this->message .= '<p>Registration was successful</p>';
    $this->set_session($result,$remember,true); //log user on
    return true;
    } else {
    $this->message .= '<p>username already exists! Please choose a different name</p>';
    return false;
    }
    }

    function check_login($username,$password,$remember) {
    $username = mysql_escape_string($username);
    $password = mysql_escape_string(md5($password));

    $result=mysql_fetch_array(mysql_query("SELECT * FROM member WHERE username = '{$username}' AND password = '{$password}'"), MYSQL_ASSOC);
    if ($result) {
    $this->set_session($result,$remember,true);

    return true;
    } else {
    $this->failed = true;
    $this->logout();
    $this->message .= 'incorrect username of password. please try again';
    return false;
    }
    }

    function logout() {
    // blowup cookie
    setcookie('remember',time()-3600);
    $this->set_session_defaults();
    session_destry(); //NUR HIER HABE ICH SELBST EINGEFÜGT!
    }

    function set_session($result,$remember,$init = true) {
    $uid=$result['uid'];
    if ($init) {
    $session = mysql_escape_string(session_id());
    $ip = mysql_escape_string($_SERVER['REMOTE_ADDR']);
    $newtoken = $this->token(); // generate a new token
    $update = mysql_query("UPDATE member SET session='{$session}', token='{$newtoken}', ip='{$ip}' WHERE uid='{$uid}'") or DIE ($this->query_error);
    }

    $_SESSION['uid'] = $result['uid'];
    $_SESSION['username'] = htmlspecialchars($result['username']);
    $_SESSION['token'] = $newtoken;
    $_SESSION['logged_in'] = true;

    if ($remember) {
    $this->update_cookie($newtoken);
    }

    }

    function update_cookie($token) {
    $cookie = serialize(array($_SESSION['username'],$token));
    setcookie('remember',$cookie, time()+12099600);
    }

    function check_remembered($cookie) {

    $serializedArray=$cookie;
    $serializedArray = stripslashes($serializedArray);
    list($username,$token) = unserialize($serializedArray);

    if(empty($username) or empty($token)) {
    return;
    } else {
    $username = mysql_escape_string($username);
    $token = mysql_escape_string($token);
    $ip = mysql_escape_string($_SERVER['REMOTE_ADDR']);
    $result = mysql_fetch_array(mysql_query("SELECT * FROM member WHERE username = '{$username}' AND token ='{$token}' AND ip = '{$ip}'"), MYSQL_ASSOC) or DIE ($this->query_error);

    if (!$result) {
    $this->set_session($result,false,false);
    }else{
    $this->set_session($result,true,true);
    }
    }
    }

    function token() {
    // generate a random token
    for($i=1;$i<33;$i++) {
    $seed .= chr(rand(0,255));
    }
    return md5($seed);
    }

    function check_session() {
    $username = mysql_escape_string($_SESSION['username']);
    $token = mysql_escape_string($_SESSION['token']);
    $session = mysql_escape_string(session_id());
    $ip = mysql_escape_string($_SERVER['REMOTE_ADDR']);
    $result = mysql_fetch_array(mysql_query("SELECT * FROM member WHERE username='{$username}' AND token='{$token}' AND session='{$session}' AND ip='{$ip}'"), MYSQL_ASSOC) or DIE ($this->query_error);

    if ($result != false){
    }else{
    $this->logout();
    }
    }


    function set_session_defaults() {
    $_SESSION['logged_in'] = false;
    $_SESSION['uid'] = 0;
    $_SESSION['username'] = '';
    $_SESSION['cookie'] = 0;
    $_SESSION['remember'] = false;
    }
    }

    ?>

    whatever.php - Hauptteil:

    <?php
    session_start();
    include 'db_connect.php';
    include 'member_class.php';
    $member_class = new member_class;


    //$Submit=$_POST['Submit']?TRUE:FALSE;
    if($_POST['Register']) { //register new user
    $username = $_POST['username'];
    $password = $_POST['password'];
    if ($username && $password) { //check whether username and password have been submitted
    if($_POST['remember'] == 1) {
    $member_class->register($username, $password, true);
    }else{
    $member_class->register($username, $password, false);
    }
    }
    else {
    $member_class->message .= '<p>please fill in a user name and password</p>';
    $_POST['form_register'] = 'true';
    }
    }
    elseif($_POST['Login']) {
    $username=$_POST['username'];
    $password=$_POST['password'];
    if ($username && $password) {
    if($_POST['remember'] ==1) {
    $member_class->check_login($username, $password, true);
    }else{
    $member_class->check_login($username, $password, false);
    }
    }
    else $member_class->message .= '<p>please fill in a valid user name and password</p>';
    }
    elseif($_POST['Logout']) {
    $member_class->logout();
    }

    echo $member_class->message;

    if($_POST['form_register']) {
    print '
    <h1>Register</H1>
    <form name="form1" method="post" action="">
    <table border="0">
    <tr>
    <td width="100px;">username:</td>
    <td><input type="text" name="username" value="'.$username.'"></td>
    </tr>
    <tr>
    <td>password:</td>
    <td><input type="password" name="password" value="'.$password.'"></td>
    </tr>
    <tr>
    <td colspan="2">
    <input type="hidden" name="register" value="true">
    <input name="remember" type="checkbox" id="remember" value="1"> remember me for 2 weeks
    </td>
    </tr>
    <tr>
    <td colspan="2" height="20px" valign="bottom" align="right"><input type="submit" name="Register" value="Register"></td>
    </tr>
    </table>
    </form>';

    }
    elseif(!$_SESSION['username']) {
    print '
    <h1>Login</H1>
    <form name="form1" method="post" action="">
    <table border="0">
    <tr>
    <td colspan="2" align="right"><input type="submit" name="form_register" value="register" style="border: 0px; background: transparant; text-decoration: underline; cursor: pointer;"></td>
    </tr>
    <tr>
    <td width="100px">username:</td>
    <td><input type="text" name="username" value="'.$username.'"></td>
    </tr>
    <tr>
    <td>password</td>
    <td><input type="password" name="password" value="'.$password.'"></td>
    </tr>
    <tr>
    <td colspan="2">
    <input name="remember" type="checkbox" id="remember" value="1"> remember me for 2 weeks
    </td>
    </tr>
    <tr>
    <td colspan="2" height="20px" valign="bottom" align="right"><input type="submit" name="Login" value="Login"></td>
    </tr>
    </table>
    </form>';
    }elseif($_SESSION['username']) {
    echo '<p>'.$_SESSION['username'].', you\'re logged on</p>';
    print '
    <form name="form1" method="post" action="">
    <input type="submit" name="Logout" value="Logout">
    </form>';
    }
    ?>

    db_connect.php - Verbindung mit der MySQL-Datenbank:

    <?php
    /**
    * Connect to the mysql database.
    */
    $conn = mysql_connect("localhost", "username", "password") or die(mysql_error());
    mysql_select_db('database', $conn) or die(mysql_error());
    ?>

    @zeno: wo sollte ich deiner Meinung nach den von dir geposteten Code einsetzen? Habe versucht ganz oben im whatever.php - aber danach gibts kein login mehr...

    @drok: schwer zu sagen...das script hat ausser login/logout noch keine funktionen...aber dennoch möchte ich nicht, dass die Taste-Zurück "funktioniert"...geht bei GMX auch nicht :)

    Vielen Dank!
     
  6. zeno

    zeno Lane's Prinz Albert

    Dabei seit:
    05.11.05
    Beiträge:
    4.898
    In jede Datei die was anzeigt und durch ne Session gesichert werden soll
     
  7. newmacuser24

    newmacuser24 Antonowka

    Dabei seit:
    27.12.05
    Beiträge:
    355
    OK, erledigt...hab ich sowohl ins members_class.php, als auch ins whatever.php gepackt...leider geht "zurück-Taste" noch immer...eigenartig...

    Browser-Cache hab ich entleert, bzw. neu gestartet. Verwende Safari und FireFox zum Testen...

    Interessanterweise klappts jetzt im FireFox, in Safari nicht...
     
    #7 newmacuser24, 15.02.08
    Zuletzt bearbeitet: 15.02.08
  8. newmacuser24

    newmacuser24 Antonowka

    Dabei seit:
    27.12.05
    Beiträge:
    355
    Interessant...scheint wie gesagt NUR Safari zu betreffen. Der Account wird durch die Taste "zurück" wieder angezeigt, trifft man aber eine Auswahl wird man sofort rausgekickt...könnte das ein bug sein? Könnte ja die Accountseite schon vertrauliche Information enthalten...Firefox verhält sich da korrekt...

    Ist übrigens bei anderen Login-Seiten das gleiche...
     

Diese Seite empfehlen