Problem mit Session und Login



  • Hallo,

    ich habe gerade angefangen mich mit dem Thema Sessions zu beschäftigen und habe jetzt ein Problem. Ich habe drei php Seiten, die erste eine Login Seite mit Fromular in der man ein Passwort eingibt, die zweite ein Formular in der man auch Daten eingibt und die dritte Seite in der die Daten der zweiten Seite ausgewertet werden.

    Die Login.php Seite:

    <?php
    	session_start();
    ?>
    
    <form method="post" action="index.php" target="_self">
    <table width="500" border="0" cellspacing="0" cellpadding="0">
    <tr>
    	<td><font face="Arial, Helvetica, sans-serif" size="2">Passwort</font></td>
    </tr>
    
    <tr>
    	<td>
            <input type="password" name="pass">
    		<input type="submit"  value="einloggen">
    		<input name="PHPSESSID" type="text" id="PHPSESSID" value="<?php echo session_id();?>">
    	</td>
    </tr>
    </table>
    </form>
    

    Die index.php sieht ungefähr so aus:

    <?php
     session_start();
    
     include("include.php");
    
    	if( !isset($_POST['pass']) )
    	{
    		//show admin-login
    		include("login.php");
    		exit;
    	}
    
    	$pass1 = md5( $_POST['pass'] );
    	$_SESSION['pass'] = $pass1;
    
    	if ( $pass1 != $passwort )
    	{
    		echo "<font face=\"Arial, Helvetica, sans-serif\" size=\"2\">Falsche Passworteingabe</font>";
    		include("login.php");
    		exit;
    	}
    ?>
    
    <form name="form1" method="post" action="seite3.php">
    <input name="Submit2" type="submit" class="submit" value="Seite anlegen">
    <input name="PHPSESSID" type="text" id="PHPSESSID" value="<?php echo session_id();?>">
    </form>
    

    So, in der include.php steht das zu vergleichende Passwort md5 verschlüsselt.
    Die seite3.php sieht dann ungefähr so aus:

    <?php
      session_start();
    
    	include("include.php");
    
    	if( !isset($_SESSION['pass']) OR $_SESSION['pass'] != $passwort )
    	{
    		include("login.php");
    		exit;
    	}
    .
    .
    .
    	Verarbeitung der Daten,
    	bei Erfolg: include("index.php");
    	sonst nichts.
    
    ?>
    

    Mein Problem ist nun das auf der seite3.php das $_SESSION['pass'] leer ist und somit ich wieder beim login lande.
    Ich habe in meiner php.ini das register_globals auf off stehen.
    Was mache ich falsch?
    Ich möchte einfach das man so lange die Seiten aufrufen kann, also index und seite3 wie man eingeloggt ist.
    Auf der index habe ich dann noch ein Logout link mit session_unset().
    😕
    Und wie macht man das, wenn ich mit dem Zurück Button des Browsers eine Seite zurück gehe, innehalb der Session, das nicht diese Meldung kommt, die angeforderte Siete ist nicht mehr aktuell???

    Ich danke euch schon mal für eure Erklärungsversuche und hoffe das ich mich nicht all zu doof anstelle.



  • Lass dir doch mal auf jeder Seite die Session-ID ausgeben, ich nehme an, dass diese nicht richtig übergeben wird 🙄
    Aber normalerweise geschieht das doch automatisch 😕 evtl. müsstest du vor session_start() noch session_id() mit der entsprechenden ID aufrufen, falls du das selber machen willst - aber wie gesagt: normalerweise muss man sich darum gar nicht mehr kümmern (je nach Konfiguration)

    Heavenfighter schrieb:

    Und wie macht man das, wenn ich mit dem Zurück Button des Browsers eine Seite zurück gehe, innehalb der Session, das nicht diese Meldung kommt, die angeforderte Siete ist nicht mehr aktuell???

    Das eine Sache des Browsers und lässt sich daher nicht direkt beeinflussen. Das hängt afaik damit zusammen, dass für die Erzeugung der Seite Daten übermittelt wurden (imho per Formular mit POST) - bin mir aber nicht mehr 100%ig sicher 🕶



  • Hast du Cockies aktiviert. Wenn nein wo soll PHP dann die SessionID her haben.
    SID kann immer drangehängt werden. Wenn Cockies aktiviert sind ist sie eben leer
    <form name="form1" method="post" action="seite3.php?<=SID>">



  • So,

    vielleicht habe ich das ganze Thema falsch verstanden. Wozu brauche ich Cookies wenn ich die Session Id, welche übrigens richtig ist auch in den nachfolgenden Seite, per post in einem hidden Feld weiterreiche?

    Wie würdet ihr das denn machen?
    Ich brauche so was wie eine Login Seite, wo nur ein Passwd abgefragt wird. Auf der nächsten Seite soll es dann mit einem bereits verschlüsselten passwd in einer include Datei verglichen werden. Wenn beide ungleich dann wieder login. Soweit alles kein Problem.
    Ich habe auf dieser Seite ein neues Formular. Dieses Formular sendet seine Daten an eine Dritte Seite. Auch heri soll wieder das passwd verglichen werden.
    Das könnte ich auch noch durch weiterreichen in textfeldern erreichen. Ist ja alles kein Problem.
    Jetzt hat aber die dritte Seite einen Link zur ersten, sozusagen einen Home-Link. Wenn ich den aber aufrufe, dann weiß die erste Seite ja aber nicht das ich bereits eingeloggt bin, da ja kein per post gesendetes passwd vorhanden.
    Da dachte ich kommen nun sessions zum Einsatz.



  • Also im "Normalfall" wird die Session-ID in einem Cookie gespeichert, und wenn das nicht geht (oder in der php.ini anders eingestellt ist) per GET. Wenn enable-trans-id (bin gerade zu faul zum Nachschlagen, ob das so hieß 🤡 ) beim Compilieren von php mit angegeben wurde und afaik in der php.ini aktiviert ist, dass werden URLs, die auf den gleichen Server verweisen ggf. automatisch um die Session-ID ergänzt.

    Also bei dir wird jetzt mit echo session_id(); auf jeder Seite die gleiche ID ausgegeben?
    Hast du PHP >= 4.1.0
    Was gibt ein var_dump($_SESSION) nach session_start() aus?



  • Hast du schon mal versucht die benötigten Variablen per session_register
    in der Session zu registrieren??
    Soweit ich weiß muss jede Variable bevor man sie verwenden kann, erst einmal in der Session registriert werden, und später mit der gleichen Funktion auch wieder zur Verfügung gestellt werden.
    Das heißt:

    <?php 
     session_start(); 
    
     // du prüfst übrigens die Userdaten bevor du sie irgendeiner lokalen Variablen zu gewiesen hast, also:
    
     $pass1 = md5($_POST['pass']);
     session_register(pass1);
    
     include("include.php"); 
    
        if( !isset($_POST['pass']) ) 
        { 
            //show admin-login 
            include("login.php"); 
            exit; 
        } 
    
        $pass1 = md5( $_POST['pass'] ); 
        $_SESSION['pass'] = $pass1; 
    
        if ( $pass1 != $passwort ) 
        { 
            echo "<font face=\"Arial, Helvetica, sans-serif\" size=\"2\">Falsche Passworteingabe</font>"; 
            include("login.php"); 
            exit; 
        } 
    ?> 
    
    <form name="form1" method="post" action="seite3.php"> 
    <input name="Submit2" type="submit" class="submit" value="Seite anlegen"> 
    <input name="PHPSESSID" type="text" id="PHPSESSID" value="<?php echo session_id();?>"> 
    </form>
    


  • session_register ist definitiv nicht notwendig.
    Genauso wie Session_unregister. (man nimmt hier unset)

    Einer Standardinstallation mit Apache und PHP muss man die SID übergeben. Mache es mal so wie ich dir aufgezeigt habe und sdchau nach ob in SID immer die gleiche SID drin ist. Ich habe hier viele Seiten (auch CHAT) wo ich es so machen und es funktioniert. Und egal welche Einstellungen der Apache und PHP hat, sollte man sowieso immer die SID w.o. übergeben.
    Wenn Cockies aktiviert sind ist sie eben leer. Wenn Cockies deaktiviert sind steht in der SID was drin. Will man noch andere Parameter an die URL anhängen ist SID immer der letzte Parameter.



  • So,

    @Unix-Tom: Ich mache es doch schon so wie du gesagt hast. Ich übergebe die Sessionid immer in einem hidden feld per post weitergebe.
    Sie ist auch immer richtig die selbe.
    Habe ich das richtig verstanden, das ich jetzt immer nur überprüfen brauche ob die übergebene mit der in der Session Variablen gespeicherten übereinstimmt?
    Oder wie?



  • Hast du jetzt mal ein var_dump($_SESSION) gemacht? Und: was für eine PHP-Version läuft bei dir?



  • @ flenders: Das var_dump gibt folgendes aus: array(1) { ["passwd"]=> string(5) "testen"}
    und die Version die ich habe ist: 4.3.4
    Und das sind die EInstellungen bezüglich Session:

    Directive Local Value Master Value
    session.auto_start Off Off
    session.bug_compat_42 On On
    session.bug_compat_warn On On
    session.cache_expire 180 180
    session.cache_limiter nocache nocache
    session.cookie_domain no value no value
    session.cookie_lifetime 0 0
    session.cookie_path / /
    session.cookie_secure Off Off
    session.entropy_file no value no value
    session.entropy_length 0 0
    session.gc_divisor 100 100
    session.gc_maxlifetime 1440 1440
    session.gc_probability 1 1
    session.name PHPSESSID PHPSESSID
    session.referer_check no value no value
    session.save_handler files files
    session.save_path E:\Server\php\sessiondata E:\Server\php\sessiondata
    session.serialize_handler php php
    session.use_cookies On On
    session.use_only_cookies Off Off
    session.use_trans_sid Off Off



  • Und was gibt var_dump($_SESSION) auf seite3.php aus? Was genau steht alles in include.php?



  • Var_dump gibt auch auf der dritten Seite das gleiche aus.
    In der include Datei steht nur $passwort = "f5888d0bb58d611107e11f7cbc41c97a";

    also das verschlüsselte Passwort.
    Ich denke auch nicht das der Fehler irgendwie mit der Session an sich was zu tun hat, sondern eher mit meiner Vorgehensweise.
    Was wäre denn gut?
    Ich Starte mit der Loginseite; nach erfolgreichem Login gelange ich auf die erste Seite und starte eine Session; Diese Session speichere ich in eine globale Sessionvariable und leite sie zusätzlich noch per Post an die 2. Seite. Hier vergleiche ich das übergebene Passwort mit dem in der Session Variable, und so würde ich auch zur dritten Seite gelangen.
    Was ich jetzt nur nicht weiß ist, wenn zum Beispiel auf der dritten Seite was mit der Berechnung schiefläuft oder der User zurück auf die 2. Seite möchte,
    Wie mache ich das? Einfach so:

    /*Bei Fehler*/
    if (Fehler )
    {
       include("Seite2");
       exit;
    }
    .
    .
    .
    /*Link zurück*/
    <a href="seite2.php">zurück</a>
    

    Würde das so gehen? Aber woher sollte dann Seite2 noch wissen was sie von Seite1 übergeben bekommen hatte?
    Es sind also mehr Probleme mit der Struktur die ich habe.



  • Wenn du Werte auf einer beliebigen Seite in der Session speicherst (wie kannst du die Session in einer globale Sessionvariable speichern 😕 🤡 ) kannst du auf diese Werte von überall aus zugreifen. Wenn du also später die Daten, die an Seite1 übergeben wurden noch brauchst speicherst du sie am besten in der Session (theoretisch könntest du sie auch über die URL weiterreichen, aber genau das ersetzen ja eigentlich die Sessions 😉 )

    Das mit deinem include("Seite2"); verstehe ich nicht so ganz - ob das wie gewünsch funktioniert hängt dasvon ab, wie du den Aufbau hast. Ich denke aber, dass du eher eine richtige Weiterleitung machen willst: 🙂

    header('Location: http:[e]#47[/e]/'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).'/seite2.php');
    

Anmelden zum Antworten