Sessions und die Zurücktaste - kreative Lösung gesucht!

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

  • Sessions und die Zurücktaste - kreative Lösung gesucht!

    Hallo liebe PHP-Gemeinde,

    ich bin ein Php-Beginner und habe mir testweise ein Skript geschrieben, dass den Benutzernamen und ein Passwort einliest, dieses mit Einträgen aus einer SQL-Datenbank vergleicht und dementsprechen eine Session für den erfolgreich eingeloggten User startet.

    Nun habe ich aber festgestellt, dass man sich nach dem Ausloggen durch Betätigung der "Zurücktaste" des Browsers wieder "einloggen" kann bzw. man ist dann wieder in der Session drin.

    Hier das dazugehörige Skript (unsaubere Version):
    index.php
    Code:
    <html>
    	<title>Sessions + Database (Userlogin)
    	</title>
    	<body>
    		<h1>Sessions + Database (Userlogin)</h1>
    
    		<form method="post" action="login.php">
    			username : <input type="text" name="username" size="20" maxlength="20"><br>
    			password : <input type="text" name="passwd" size="20" maxlength="20">&nbsp;
    			<input type="submit" value="login">
    		</form>
    		
    	</body>
    </html>
    die login.php:
    Code:
    <?php
    		session_start();
    	/* Zuerst mit Datenbank verbinden */
    			$host="localhost";
    			$port="5432";
    			$user="sqlusr";
    			$password="";
    			$dbname="userlogin";
    			$connection = pg_connect("dbname=$dbname
    												user=$user
    												host=$host
    												port=$port");
    
    	/* Login-Informationen abrufen */
    	$username=$_POST['username'];
    	$passwd=$_POST['passwd'];
    	
    	$res=pg_query("select * from profiles where login='$username' and passwd='$passwd'");
    	$rows = pg_num_rows($res);
    	if($rows==1){
    		echo"Login erfolgreich! ";
    
    		if(!isset($_SESSION['zaehler']))
    			$_SESSION['zaehler']=0;
    		else
    			$_SESSION['zaehler']++;
    
    		$z=$_SESSION['zaehler'];
    		echo "$z<br>\n";
    		echo "<a href=\"logout?exit=1\">logout</a>";
    	}
    	else
    	{
    		echo "Login fehlgeschlagen.";
    	}
    php?>
    logout.php
    Code:
    <?php
    	session_start();
    	if($_GET['exit']==1) unset($_SESSION['zaehler']);
    php?>
    
    <html>
    	<title>PHP & Sessions</title>
    	<body>
    		<h1>PHP & Sessions</h1>
    
    		<h1>Logout erfolgreich ... </h1>
    
    		<a href="index.php">wieder einloggen</a>
    		
    	</body>
    </html>
    Hätte da einer von Euch eine kreative Lösung?

    Viele Grüsse
    phpo

  • #2
    kreativ ists nicht. session_destroy.

    Kommentar


    • #3
      Original geschrieben von miximaxi
      kreativ ists nicht. session_destroy.
      Hi,
      habe "session_destroy();" in die logout.php gepackt -
      tja, das bringts auch nicht (habe es gerade getestet ) :-(

      ich kann trotzdem per zurückbutton wieder zurück und kann den counter mittels reload hochzählen lassen :-( (bin also erfolgreich eingeloggt)

      danke trotzdem für deinen beitrag

      grüsse
      phpo

      Kommentar


      • #4
        hmm sollte ich vielleicht hier mit der sessionid arbeiten?
        also diese dann in der datenbank eintragen, wenn der user sich am anfang eingelogt hat. beim logout wird diese aus der datenbank entfernt.

        aber ist das nicht etwas umständlich, wenn man die sessionid ständig per GET übergeben muss?

        was meint ihr?

        grüsse
        phpo

        Kommentar


        • #5
          PHP-Code:
          session_start();
          if(
          $_GET['exit']==1) {
          $_SESSION = array();
          session_destroy();
          header("location: index.php"); //wieder einloggen
          exit;

          In Flames - Pinbal Map
          Becoming the Archetype - No Fall Too Far
          Pantera

          Kommentar


          • #6
            Original geschrieben von phpo

            danke trotzdem für deinen beitrag

            grüsse
            phpo
            Also im manual nachlesen, was sonst noch unter session_destroy steht, wäre Dir schon angezeigt gewesen.

            Kommentar


            • #7
              Das Problem dürfte sein, dass das Form beim Zurückbutton einfach nochmals versandt wird und wenn die Daten korrekt sind, dann ist man eingeloggt (works as designed). Könnte auch sein, dass beim Login ein Cookie für die Session ID verwendet wird und solange dieses vom Browser mitgeschickt wird, solange ist man eben eingeloggt.
              Könnte man allenfalls so
              PHP-Code:
              ini_set('session_use_cookies',0); 
              vor dem session_start() unterbinden.
              Du solltest den User nach dem Login aber mittels eines header() von der LoginSeite wegbringen (dann geht zumindest ein Refresh in die Hose

              Gruss

              tobi
              Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

              [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
              Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

              Kommentar


              • #8
                Hmm wenn ich das eventuell richtig sehe gehst du diese Schritte durch:

                index.php -> login.php -> aktualisieren für Zähler -> logout.php -> zurück Button des Browsers -> und wieder aktualisieren

                Kann es sein das da ein Abfragefenster kommt in dem gefragt wird ob POST Variablen nochmal gesendet werden sollen?

                Kommentar


                • #9
                  unter session_destroy steht ja, dass man das cookie löschen soll. Man kann auch eine neue session_id ziehen und nochmals session_start aufrufen.
                  PHP-Code:
                    //das-hat-bei-mir-funktioniert
                    
                  $schritte=0;
                    
                  $_SESSION=array();
                    
                  session_destroy();
                    
                  session_start();
                    
                  session_regenerate_id('destroy_old_id'); 
                  Zuletzt geändert von miximaxi; 13.04.2006, 08:36.

                  Kommentar


                  • #10
                    Original geschrieben von PHP-Boernie
                    Hmm wenn ich das eventuell richtig sehe gehst du diese Schritte durch:

                    index.php -> login.php -> aktualisieren für Zähler -> logout.php -> zurück Button des Browsers -> und wieder aktualisieren

                    Kann es sein das da ein Abfragefenster kommt in dem gefragt wird ob POST Variablen nochmal gesendet werden sollen?

                    Man kann im Formular ein hidden Input Feld mit einem unique Wert (zufall, timestamp, session_id) machen und sich diesen Wert serverseitig merken. Ist der Login erfolgreich (oder zuviele Versuche), löscht man bei sich den Wert. Gegen das erneute Absenden des Login-Formulars kann man nichts machen. Aber das Input-Feld passt dann nicht mehr zum serverseitigen Wert und man verarbeitet es nicht mehr.

                    Kommentar


                    • #11
                      Hi zusammen,

                      Original geschrieben von pippo
                      PHP-Code:
                      session_start();
                      if(
                      $_GET['exit']==1) {
                      $_SESSION = array();
                      session_destroy();
                      header("location: index.php"); //wieder einloggen
                      exit;

                      Das klingt gut. Bringt aber nix im Kontext des Problems (betätige mal den Zurückbutton des Browsers ;-) )

                      Original geschrieben von jahlives
                      Das Problem dürfte sein, dass das Form beim Zurückbutton einfach nochmals versandt wird und wenn die Daten korrekt sind, dann ist man eingeloggt (works as designed). Könnte auch sein, dass beim Login ein Cookie für die Session ID verwendet wird und solange dieses vom Browser mitgeschickt wird, solange ist man eben eingeloggt.
                      Könnte man allenfalls so
                      PHP-Code:
                      ini_set('session_use_cookies',0); 
                      vor dem session_start() unterbinden.
                      Du solltest den User nach dem Login aber mittels eines header() von der LoginSeite wegbringen (dann geht zumindest ein Refresh in die Hose

                      Gruss

                      tobi
                      Ja, ok. Das Refresh ist ja nicht so wichtig. Denn dieses Skript dient mir nur als Model für ein kleines ManagementSystem mit MultiUser-Login. Wenn der User eingeloggt ist, dann bekommt er eben Seiten angezeigt, die andere und vor allem nichteingelogte User nicht zu Gesicht bekommen sollen. Refresh sollte er nicht vrewenden (ist auch unsinnig). Ausserdem werden die Daten automatisch aktualisiert.

                      Original geschrieben von PHP-Boernie
                      Hmm wenn ich das eventuell richtig sehe gehst du diese Schritte durch:

                      index.php -> login.php -> aktualisieren für Zähler -> logout.php -> zurück Button des Browsers -> und wieder aktualisieren

                      Kann es sein das da ein Abfragefenster kommt in dem gefragt wird ob POST Variablen nochmal gesendet werden sollen?

                      Der Dialog kommt, ja. Wenn man Cancel drückt, macht er aber nix (geht nicht zurück). Aber ein Depp, dem das egal ist (oder vielleicht beim Angriffsversuch durch einen Bot oder nen anderen User), der drückt ok und dang is er weiter.

                      Original geschrieben von miximaxi
                      unter session_destroy steht ja, dass man das cookie löschen soll. Man kann auch eine neue session_id ziehen und nochmals session_start aufrufen.
                      PHP-Code:
                        //das-hat-bei-mir-funktioniert
                        
                      $schritte=0;
                        
                      $_SESSION=array();
                        
                      session_destroy();
                        
                      session_start();
                        
                      session_regenerate_id('destroy_old_id'); 
                      Ich werd das gleich mal ausprobieren, wobei ich eben nach mal session_destroy(); vor das session_start() gepackt habe und dann gabs ne Fehlermeldung ...

                      Original geschrieben von miximaxi
                      Man kann im Formular ein hidden Input Feld mit einem unique Wert (zufall, timestamp, session_id) machen und sich diesen Wert serverseitig merken. Ist der Login erfolgreich (oder zuviele Versuche), löscht man bei sich den Wert. Gegen das erneute Absenden des Login-Formulars kann man nichts machen. Aber das Input-Feld passt dann nicht mehr zum serverseitigen Wert und man verarbeitet es nicht mehr.
                      Ja genau! An sowas habe ich auch gedacht. Die Frage ist nur, ob es seitens PHP auch nicht etwas weniger umständlich geht.

                      Viele Grüsse
                      phpo

                      Kommentar


                      • #12
                        Die Frage ist nur, ob es seitens PHP auch nicht etwas weniger umständlich geht.

                        Das ist nicht sehr umständlich. Es gibt zwei Varianten, sich das "serverseitig" zu merken. (a) mit einer Session-Variabeln. Die Session beginnt übrigens beim Aufruf des login-Formulars und geht bis zum logout (oder überhaupt ewig).
                        (b) ad-hoc mit einem Cookie, in welches der aktuelle hidden-wert gespeichert wird (bzw. gelöscht oder nichts, wenn kein hidden draussen ist). Bei einem go-back bekommt das php-Programm die alten Formulardaten inkl. hidden nochmals, aber trotzdem das neue Cookie, welches bei go-back nicht zurückgestellt wird..

                        Die kompliziertheit kommt einerseits von der state-losigkeit des Browsens, welche in eine statehaftigkeit verwandelt werden muss, und zweitens davon,dass der eigentlich sequentielle, pascal-artige Ablauf mit schönen while's (<-vor allem) bei jedem user-input gebrochen wird, und dafür braucht es auch die states und für jeden user-input-schritt einen eigene Zustandsnummer. Das ist noch nicht sehr gut in der Programmiertheorie ausgearbeitet (FSM), und entsprechend sehen die state-managements aus.

                        Kommentar

                        Lädt...
                        X