Session Login auf Cookie umbauen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Session Login auf Cookie umbauen

    Hallo,

    Für eine Vereins Homepage habe ich ein kleines Login Script.
    Soweit läuft alles, allerdings beschweren sich nun die Member das sie sich nach 24 Stunden neu einloggen müssen.
    Genau, mein Login Script spiechert die IP. Nun würde ich das ganze gerne auf Cookie umbauen. Ich habe mich bereits daran versucht aber bin voll gescheitert.

    Ich weiss, es ist nicht das Sicherste und Beste, aber es hat immer seine Dienste getan.
    Hier mal mein Code, evtl hat wer Tips bezüglich Cookie oder gar nen Komplettes Script auf seinem Rechner.

    Quellcode

    1. // Prüfen ob eingeloggt
    2. function chkonline()
    3. {
    4. $anfrage = "SELECT `user_id` FROM `users_online` WHERE `ip` = '".$_SERVER['REMOTE_ADDR']."' AND `session` = '".session_id()."'";
    5. $ergebnis = mysql_query($anfrage);
    6. if($ergebnis !== false)
    7. {
    8. $anz = mysql_num_rows($ergebnis);
    9. if ($anz == 0)
    10. {
    11. return false;
    12. }
    13. $zeile = mysql_fetch_row($ergebnis);
    14. return $zeile[0];
    15. }
    16. else
    17. {
    18. return false;
    19. }
    20. }
    21. // Switch abfrage im Template ob User eingeloggt ist und bereiche sehen kann. Stammt aus dem phpbb2 bzw 3
    22. if ( chkonline() )
    23. {
    24. $template->assign_block_vars('switch_user_logged_out', array());
    25. }
    26. else
    27. {
    28. $template->assign_block_vars('switch_user_logged_in', array());
    29. }
    Alles anzeigen


    Und hier das eigentliche Login Script

    Quellcode

    1. if ( isset($_POST['submit']) )
    2. {
    3. $username = income($_POST['username']);
    4. $password = $_POST['password'];
    5. $message = false;
    6. $sql = "SELECT `id`, `username`, `passwort` FROM `users` WHERE `username` = '".$_POST['username']."'";
    7. $result = db_query($sql);
    8. $row = mysql_fetch_assoc($result);
    9. if ( !$_POST['username'] )
    10. {
    11. $message .= $lang['no_username']. '<br />';
    12. $fehler = true;
    13. }
    14. if ( !$_POST['password'] )
    15. {
    16. $message .= $lang['no_password']. '<br />';
    17. $fehler = true;
    18. }
    19. if ( !$_POST['username'] == $row['username'] )
    20. {
    21. $message .= $lang['no_login_user'] . '<br />';
    22. $fehler = true;
    23. }
    24. if ( !isset($fehler) )
    25. {
    26. if(chkonline() === false)
    27. {
    28. $sql = "DELETE FROM `users_online` WHERE `user_id` = '".$row['user_id']."' LIMIT 1";
    29. $result = db_query($sql);
    30. $sql = "INSERT INTO `users_online` VALUES('".$row['id']."','".$row['id']."','".$_SERVER['REMOTE_ADDR']."','".$session_id."')";
    31. $result = db_query($sql);
    32. $message .= $lang['login_ok'] . '<br />';
    33. }
    34. else
    35. {
    36. $message .= $lang['login_true'] . '<br />';
    37. }
    38. }
    39. }
    Alles anzeigen
  • na ist doch wunderbar...

    in der chkonline#4 musst du nur die IP Adresse als Einschränkung weglassen und $_COOKIE['deinkey'] statt der session_id() verwenden

    und in der login methode #33 verwendest du als $session_id eine zufällige Zeichenkette, die du auch als Cookie speichest

    Quellcode

    1. $session_id = uniqid(rand(), true);
    2. setcookie('deinkey', $sessionid, strtotime('+1 year'));


    Der Rückgabewert der Funktion ist übrigens 32 Byte groß - es bietet sich also an deine Tabellenspalte mit char(32) auszustatten.
    Mehr Informationen zu random Funktion: [wiki]Gutes Passwort mit PHP erstellen[/wiki]
  • HuHu,

    Also ich habe das jetzt mal geändert. Beim 1 Login hat er den cookie angelegt, nach dem löschen des cookies will er aber keinen mehr anlegen.
    Mein sql spalte habe ich auf TEXT 255 geändert da der cookie key was länger ist.

    Quellcode

    1. $user_key = md5($pass.$user).'-irc-'.time().'-'.$user;
    2. setcookie('point', $user_key, time()+(3600*24*100));


    Wie gesagt, beim 1 mal klappte es, nach löschen des cookies legt er keine mehr an.

    lg
    Klari22

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Klari22 ()

  • HuHu,

    Jep, ist nur ein Fehler vom Kopieren.
    Genau das ist es, ich melde mich neu an, der user_key wird auch in der Datenbank eingetragen, aber er legt keine Cookies mehr von dieser Seite an.

    Wie gesagt, ich habe den coockie im FF manuell gelöscht um den neuen key zu testen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Klari22 ()

  • Das heißt dein Code hat bisher einmal funktioniert und danach nie wieder?
    Klingt unwahrscheinlich.

    Kann es sein, dass Fehler passieren die du nicht anzeigst?
    Zum Beispiel das insert in #33 - was geschieht, wenn die userid schon "online" ist?

    was hältst du von einem

    Quellcode

    1. ... ON DUPLICATE KEY UPDATE session_id = $session_id, ip = $ip;
  • Doch, ein fehler wird mir angezeigt.

    Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\site\templates_c\%%FA^FA4^FA44DF90%%page_header.htm.php:7) in C:\xampp\htdocs/site\class\user.php on line 145
    Linie 145 ist zei Zeile wo er den Coockie sendet.

    Ne, Duplicat ist nicht vorhanden, der wird aus der DB entfernt falls ein eintrag vorhanden ist

    Hier mal ein wenig mehr vom Code

    Quellcode

    1. $DB->set_sql('SELECT * FROM ircd_users_online
    2. WHERE username =:1');
    3. $DB->execute($user);
    4. $row = $DB->fetch_assoc();
    5. $DB->free();
    6. if ( $row != false )
    7. {
    8. $DB->set_sql('DELETE FROM ircd_users_online WHERE username =:1 LIMIT 1');
    9. $DB->execute($user);
    10. $DB->free();
    11. }
    12. $user_key = md5($pass.$user).'-irc-'.time().'-'.$user;
    13. setcookie('point', $user_key, time()+(3600*24*100));
    14. $user_array = array();
    15. $user_array['user_id'] = $row['user_id'];
    16. $user_array['username'] = (string) $user;
    17. $user_array['user_key'] = (string) $user_key;
    18. $DB->set_sql('INSERT INTO ircd_users_online ' . $DB->syntax_built(SQL_INSERT, $user_array));
    19. $DB->execute();
    20. $DB->free();
    Alles anzeigen
  • Klari22 schrieb:

    Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\site\templates_c\%%FA^FA4^FA44DF90%%page_header.htm.php:7) in C:\xampp\htdocs/site\class\user.php on line 145


    na da ist doch der Fehler.
    Wenn du schon eine Ausgabe an den Browser gesendet hast (via echo oder eben über ein Template), dann ist es zu spät um noch ein Cookie hinterherzusenden.
    Du musst die vorherige Ausgabe entfernen
  • HuHu,

    Der Umbau des alten Login Script treibt mich in den Wahnsinn.
    Ich bekomme es nun absolut nicht hin zu prüfen ob eingelogt oder nicht und im Template dann mit {if $LOGGED_IN} und {if $LOGGED_OUT} Bereiche auszublenden bzw einzublenden.

    Ich habe jetzt die ganze Nacht an dem Script gesessen und binn am Ende.
    Kann mir jemand das Script bitte verfolständigen oder zumindest einen Anstoß geben wie es aussehen müsste?

    Quellcode

    1. public function login_status()
    2. {
    3. global $DB, $Smarty, $Core;
    4. $user_cookie = $_COOKIE['point'];
    5. $DB->set_sql('SELECT * FROM ircd_users_online
    6. WHERE user_key =:1');
    7. $DB->execute($user_cookie);
    8. $login_row = $DB->fetch_assoc();
    9. $DB->free();
    10. if ( $login_row )
    11. {
    12. }
    13. else
    14. {
    15. }
    16. }
    17. $Smarty->assign(array(
    18. 'PAGE_HEADER' => $this->config['sitename'] . ' : ' . $this->config['description'] . ' &bull; ' . $title,
    19. 'IS_LOGED' => $User->login_status('user_key') == 1 ? true : false,
    20. 'U_LOGIN_SEND' => 'login.php?mode=login',
    21. ));
    Alles anzeigen
  • Zum Verständnis wie Cookies funktionieren

    das funktioniert nicht:

    Quellcode

    1. setCookie('foo', 'x');
    2. echo $_COOKIE['foo'];


    das funktioniert:

    Quellcode

    1. setCookie('foo', 'x');
    2. // pagerefresh
    3. echo $_COOKIE['foo'];


    das ist ein legitimer Workaround

    Quellcode

    1. setCookie('foo', 'x');
    2. $_COOKIE['foo'] = 'x';
    3. echo $_COOKIE['foo'];


    schau dir mal mit Firefox über Privatsphäre > Cookies an, ob das Cookie wirklich gesetzt ist und mit welchen Attributen (Domain, Pfad, Gültigkeit, ...) es gespeichert wurde
    Wenn Firefox sagt es ist da, und Domain/Pfad existieren, dann muss auch PHP darauf Zugriff haben.

    Außerdem ein nützliches Firefox Addon: FireCookie (in Kombination mit Firebug)
  • HuHu,

    Cookie wird mittlerweile gesetzt, und auslesen kann ich den auch, war noch nen kleiner Fehler noch im Script.

    Ist nur noch das Problem mit dem Loggin Status wie ich vorhin beschrieben habe um einzente Teile im Template auszublenden.

    Ich hatte ja Anfangs vor nur das Login System umzubauen da es absolut nicht OOP war und total unübersichtlich, mittlerweile stell ich die ganze Seite um. Neuer Code, Klassen ect. Das einzige was noch fehlt ist eben bestimmte Bereiche im Template ausblenden wenn eingeloggt/ausgeloggt. Vorher nutze ich noch die Template Engine vom phpBB3 da klappte alles, jetzt ist es Smarty und ein "einfacher Umbau gestallet sich schwer.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Klari22 ()

  • Hallo,

    Ok, mit

    Quellcode

    1. if ( $login_row )
    2. {
    3. return true;
    4. }
    5. else
    6. {
    7. return false;
    8. }


    klappt es dann doch. Ein Problem habe ich noch, unzwar den Usernamen oder die ID in den Scripten verwenden. Gestern klappte alles, heute will es nun nicht mehr.

    Quellcode

    1. // Login Userdaten sammeln
    2. public function user_data()
    3. {
    4. global $DB, $Smarty, $Core, $User;
    5. if ($User->login_status() == false )
    6. {
    7. $DB->set_sql('SELECT *
    8. FROM ircd_users
    9. WHERE user_id = 1');
    10. $DB->execute();
    11. $userdata = $DB->fetch_assoc();
    12. $DB->free();
    13. }
    14. else
    15. {
    16. $user_cookie = $_COOKIE['point'];
    17. $DB->set_sql('SELECT o.*, u.*
    18. FROM ircd_users_online AS o,
    19. ircd_users AS u
    20. WHERE o.user_key =:1
    21. AND o.username = u.username');
    22. $DB->execute($user_cookie);
    23. $userdata = $DB->fetch_assoc();
    24. $DB->free();
    25. }
    26. }
    Alles anzeigen


    Wenni ch die Daten jetzt mit $Core->user_data['username']; oder echo $userdata['username']; ausgeben lassenwill geht garnix.
    Wie gesagt, gestern lief es noch.