Problem beim Autologin mit Session+Cookies

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem beim Autologin mit Session+Cookies

    hallo.

    ich möchte gern ein Auto-Login-System programmieren.

    Das bisherige System funktioniert so:

    es existiert eine index.php mit dem grundgerüst der seite. dieses besteht natürlich aus Tabellen und es existiert in diesen tabellen sowohl ein menübereich als auch ein großes feld, dass den content-frame darstellt.

    beim menüaufbau wird geprüft, welche menüpunkte angezeigt werden (da sich das ändert jenachdem ob man eingeloggt ist oder nicht), indem das script schaut:
    PHP-Code:
    if (isset($_SESSION['sess_id'])){
    //Zeige spez. Menüpunkte

    Weiters besteht natürlich die Möglichkeit, dass der User manuell einfach "index.php?p=Adminarea" oder sowas angibt. es wird als nächstes also erstmal alle möglichen "p"s abgeklappert die ohne gültige $_SESSION['sess_id'] nicht erreichbar sein dürfen und es erfolgt dann ein header("Location: index.php?p=Login");

    wenn das erledigt ist und der seitenaufbau bei dem contentframe angekommen ist, wird je nach "p" eine php datei included. soweit so gut, das war der grobe aufbau der seite.

    Das bisherige System war ein Session-Loginscript. Man kommt auf die Loginseite (also eigentlich die index.php mit includetem login formular), gibt die daten ein. das <form> leitet die daten an die datei "login_submit.php" weiter. diese überprüft name und pw auf gültigkeit und setzt dann die $_SESSION[''sess_id] mit dem Wert der User-ID (Anmerkung: den Wert $_SESSION[''sess_id] brauche ich in der seite sehr häufig, da dieser ja die ID des Users darstellt. Dieser Wert soll nicht die "SID" sein die vom server automatisch generiert wird)

    Nun soll man beim Login aber auch noch die Checkbox "Eingeloggt bleiben" haben. ist diese aktiv wird in der login_submit automatisch das cookie "remember" erstellt mit einem zufälligen wert, der dann auch in der DB in der tabelle "users" eingetragen wird. Es werden also nicht username/PW im cookie gespeichert sondern nur eine zufälig generierte Zahl. Diese ist übrigens:
    PHP-Code:
    md5 (uniqid (rand())); 
    Soweit so gut, jetzt kommen die Kontrollen ins Spiel. Ich habe erstmal ein Grundgerüst geschrieben, aber nicht mal das funktioniert richtig.

    In dex index.php habe ich zu beginn folgendes hinzugefügt:
    PHP-Code:
    if (!isset($_SESSION['sess_id']))
    {
        
    $optionalpage "";
        if (isset(
    $_GET['p']))
        {
            
    $optionalpage "?p=".$_GET['p'];
        }
        
    header('Location: check4cookie.php'.$optionalpage);
        exit;

    Jetzt zum Inhalt der check4cookie.php:
    PHP-Code:
    if (isset($_COOKIE['remember'])) // if a cookie exists
    {
        
    //check if it contains a valid value
        //if it is valid, update the $_SESSION['sess_id'] value and
        //update the database and the cookie with a fresh random number
        //if it isn't valid, redirect to the login form
    }
    else 
    {
        
    //head to the loginpage, but only when forced (so that you won't get to the login
        //screen just because you want to get the correct menu-links or watch unprotected sites,
        
    if (isset($_GET['forced']))
        {
            
    header("Location: index.php?p=Login");
            exit();
        }
        else 
        {
            if (isset(
    $_GET['p']))
            {
                
    $page "?p=".$_GET['p'];
            }
            else 
            {
                
    $page "";
            }
            
    header('Location: index.php'.$page);
            exit();
        }

    leider funktioniert das irgendwie nicht.
    Firefox meldet dieses hier: "Die aufgerufene Website leitet die Anfrage so um, dass sie nie beendet werden kann."

    Wieso sagt Firefox das ? Es wird erst auf die check4cookies.php umgeleitet, von dieser dann auf eine andere Seite. ist sowas nicht zulässig ?

    Wie kriege ich das Problem in den griff ? eine "Notfall-Lösung" wäre natürlich, den ganzen code den ich in check4cookies.php habe, direkt in die index.php einzubauen, also etwa so:
    PHP-Code:
    if (!isset($_SESSION['sess_id']))
    {
        
    //Inhalt von check4cookies.php

    aber ich fände die bisherige lösung eleganter.

    Habt ihr vorschläge ?
    MfG

  • #2
    firefox gibt die meldung schon zurecht aus.

    wenn man nicht eingeloggt ist wird man von der index.php auf die check4cookie.php weitergeleitet.
    von dort kommt man wieder zur index.php und ist noch immer nicht eingelogged


    was anderes:
    warum willste net das pw und die userid im cookie speichern?
    ist natuerlich unsicher, aber deine 'remember'-wert ist imo nicht sicherer

    Kommentar


    • #3
      also ich habe irgendwo gelesen dass es besser ist, lieber so einen wert zu speichern anstatt das pw selbst

      aber egal jetzt. auf jeden fall bin ich weitergekommen und das script funktioniert soweit: ich arbeite nicht mehr mit der check4cookies.php sondern das befindet sich direkt in der index.php

      sieht bis jetzt also so aus. habe mir extra sogar zum testen einen link angelegt, der die session zerstört, da ich ja nicht immer diese 24 minuten abwarten kann . und tatsächlich: wenn ich die session zerstäre wird eine neue wieder hergestellt. also bin ich jetzt erstmal glücklich
      PHP-Code:
      if (!isset($_SESSION['sess_id']))
      {
          if (isset(
      $_COOKIE['remember'])) // if a cookie exists
          
      {
              
      //check if it contains a valid value
              
      $cookiesql "SELECT ID, username, password, cookie_id FROM `".$prefix."members` WHERE cookie_id='".$_COOKIE['remember']."'";
              
      $cookiequery mysql_query($cookiesql) or die(mysql_error());
              
      $queryfetch mysql_fetch_array($cookiequery);
              
      $cookie_is_valid mysql_num_rows($cookiequery);
              if (
      $cookie_is_valid == "1"
              {
                  
      //if it is valid, update the $_SESSION['sess_id'] value and
                  //update the database and the cookie with a fresh random number
                  
      $newvalue md5 (uniqid (rand()));
                  
      $newcookiesql "UPDATE `".$prefix."members` SET cookie_id='".$newvalue."' WHERE ID=".$queryfetch['ID'];
                  @
      mysql_query($newcookiesql) or die(mysql_error());
                  
      $_SESSION['sess_id'] = $queryfetch['ID'];
                  
      //$_SESSION['sess_pass'] = $queryfetch['password'];
                  
      $expire time()+60*60*24*7// expires after one week
                  
      setcookie("remember"$newvalue$expire"/ladder/");
                  
                  
      // Update last login 
                  
      $updatesql "UPDATE `".$prefix."members` SET lastlogin=".time()." WHERE id=".$_SESSION['sess_id'];
                  @
      mysql_query($updatesql) or die(mysql_error());
              }
              else 
              {
                  
      //if the cookie isn't valid, delete the cookie:
                  
      setcookie ("remember"""time()-3600"/ladder/");
                  
      //header("Location: index.php?p=Login&badcookie=");
              
      }
          
          
          }

      P.S. Was mir aufgefallen ist (und das war ein grund wieso ich echt ein wilchen grübeln musste): wenn ich ein cookie erstelle, muss die schreibweise von setcookie beim updaten oder löschen genau die gleiche sein. wenn ich also
      setcookie("remember", $newvalue, $expire, "/ladder/");
      mache kann ich es nur durch
      setcookie ("remember", "", time()-3600, "/ladder/");
      wieder löschen, nicht aber durch
      setcookie ("remember", "", time()-3600);
      also mit den parametern "path" und "domain" ist echt nich zu spaßen^^

      Kommentar

      Lädt...
      X