Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] login / logout -> browser backbutton disable

Einklappen

Neue Werbung 2019

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

  • [Erledigt] login / logout -> browser backbutton disable

    Hallo zusammen,

    ich suche nun schon eine ganze Weile und habe hier und da einige Lösungsansätze ausprobiert, leider ist das alles irgendwie und so nicht ...
    Das konkrete Problem besteht darin, dass nach einem erfolgreichen Login (Session user data) -> bei LOGOUT der user mit dem back Browser button wieder auf die Oberfläche gelangt.

    ich wollte euch mal fragen, welchen weg man am besten gehen kann um das zu verhindern?
    im Moment logt sich der user mit loginWithSessionData() ein

    FRAGEN:
    Sollte man sich mit Cookies anmelden? ist das eine bessere Variante? und worauf ist evtl zu achten?

    ich verstehe nicht so recht, warum die daten trotz Session_destroy(), immer noch vom Browser erkannt werden. (browserhistory) -> wäre es hier sinnvoll das loginformular [input] irgendwie zurückzusetzen (wärend die daten gesendet werden)? (ob das möglich ist?)
    Login erfolgt via $_POST['xxxuser']
    LOGOUT btn hat die form: index.php?logout

    index.php
    PHP-Code:
    $login = new Login();

    // ... ask if we are logged in here:
    if ($login->isUserLoggedIn() == true) {
        
        include(
    "views/logged_in.php");
    } else {
        
    // login Formular
        
    include("views/not_logged_in.php");

    Über jegliche Idee oder Anregung zu diesem Thema bin ich dankbar.
    thnx.
    m.

    ps. js kommt z.b. für Browserhistory nicht in Frage, es sollte schon alles über php und die Routine der Oberfläche laufen, da ich hier mehr Kontrolle darüber habe, auch wenn standardmässig javascript aktiviert ist in 90% aller Fälle.


  • #2
    Wenns richtig gemacht wurde, sollte der Back Button keine Rolle spielen.

    Aber von deinem Code her kann man nur Raten. Session nicht richtig gelöscht?

    Kommentar


    • #3
      logout function:
      PHP-Code:
      public function doLogout()
          {
              
      $this->deleteRememberMeCookie();

              
      $_SESSION = array();
              
      session_destroy();

              
      $this->user_is_logged_in false;
              
      $this->messages[] = MESSAGE_LOGGED_OUT;
          } 
      oder fehlt da noch eine angabe?

      Kommentar


      • #4
        Wie sieht den die deleteRememberMeCookie() und isUserLoggedIn() Methode aus?

        Könnte an $_SESSION = array(); liegen, jenach wie das isUserLoggedIn() aufgebaut ist.

        Daher vielleicht
        PHP-Code:
        session_unset();
        session_destroy(); 

        Kommentar


        • #5
          PHP-Code:
              private function deleteRememberMeCookie()
              {
                  
          // if database connection opened
                  
          if ($this->databaseConnection()) {
                      
          // Reset rememberme token
                      
          $sth $this->db_connection->prepare("UPDATE users SET user_rememberme_token = NULL WHERE user_id = :user_id");
                      
          $sth->execute(array(':user_id' => $_SESSION['user_id']));
                  }

                  
          // set the rememberme-cookie to ten years ago (3600sec * 365 days * 10).
                  // that's obivously the best practice to kill a cookie via php
                  // @see http://stackoverflow.com/a/686166/1114320
                  
          setcookie('rememberme'falsetime() - (3600 3650), '/'COOKIE_DOMAIN);
              } 
          PHP-Code:
              private function loginWithPostData($user_name$user_password$user_rememberme)
              {
                  if (empty(
          $user_name)) {
                      
          $this->errors[] = MESSAGE_USERNAME_EMPTY;
                  } else if (empty(
          $user_password)) {
                      
          $this->errors[] = MESSAGE_PASSWORD_EMPTY;

                  
          // if POST data (from login form) contains non-empty user_name and non-empty user_password
                  
          } else {
                      
          // user can login with his username or his email address.
                      // if user has not typed a valid email address, we try to identify him with his user_name
                      
          if (!filter_var($user_nameFILTER_VALIDATE_EMAIL)) {
                          
          // database query, getting all the info of the selected user
                          
          $result_row $this->getUserData(trim($user_name));

                      
          // if user has typed a valid email address, we try to identify him with his user_email
                      
          } else if ($this->databaseConnection()) {
                          
          // database query, getting all the info of the selected user
                          
          $query_user $this->db_connection->prepare('SELECT * FROM users WHERE user_email = :user_email');
                          
          $query_user->bindValue(':user_email'trim($user_name), PDO::PARAM_STR);
                          
          $query_user->execute();
                          
          // get result row (as an object)
                          
          $result_row $query_user->fetchObject();
                          
                      }

                      
          // if this user not exists
                      
          if (! isset($result_row->user_id)) {
                          
          // was MESSAGE_USER_DOES_NOT_EXIST before, but has changed to MESSAGE_LOGIN_FAILED
                          // to prevent potential attackers showing if the user exists
                          
          $this->errors[] = MESSAGE_LOGIN_FAILED;
                      } else if ((
          $result_row->user_failed_logins >= 3) && ($result_row->user_last_failed_login > (time() - 30))) {
                          
          $this->errors[] = MESSAGE_PASSWORD_WRONG_3_TIMES;
                      
          // using PHP 5.5's password_verify() function to check if the provided passwords fits to the hash of that user's password
                      
          } else if (! password_verify($user_password$result_row->user_password_hash)) {
                          
          // increment the failed login counter for that user
                          
          $sth $this->db_connection->prepare('UPDATE users '
                                  
          'SET user_failed_logins = user_failed_logins+1, user_last_failed_login = :user_last_failed_login '
                                  
          'WHERE user_name = :user_name OR user_email = :user_name');
                          
          $sth->execute(array(':user_name' => $user_name':user_last_failed_login' => time()));

                          
          $this->errors[] = MESSAGE_PASSWORD_WRONG;
                      
          // has the user activated their account with the verification email
                      
          } else if ($result_row->user_active != 1) {
                          
          $this->errors[] = MESSAGE_ACCOUNT_NOT_ACTIVATED;
                      } else {
                          
          // write user data into PHP SESSION [a file on your server]
                          
          $_SESSION['user_id'] = $result_row->user_id;
                          
          $_SESSION['user_name'] = $result_row->user_name;
                          
          $_SESSION['user_email'] = $result_row->user_email;
                          
          $_SESSION['user_is_admin'] = $result_row->user_is_admin;
                          
          $_SESSION['user_logged_in'] = 1;

                          
          // declare user id, set the login status to true
                          
          $this->user_id $result_row->user_id;
                          
          $this->user_name $result_row->user_name;
                          
          $this->user_email $result_row->user_email;
                          
          $this->user_is_admin $result_row->user_is_admin;
                          
          $this->user_is_logged_in true;

                          
          //echo $this->user_is_admin;
                          // reset the failed login counter for that user
                          
          $sth $this->db_connection->prepare('UPDATE users '
                                  
          'SET user_failed_logins = 0, user_last_failed_login = NULL '
                                  
          'WHERE user_id = :user_id AND user_failed_logins != 0');
                          
          $sth->execute(array(':user_id' => $result_row->user_id));

                          
          // if user has check the "remember me" checkbox, then generate token and write cookie
                          
          if (isset($user_rememberme)) {
                              
          $this->newRememberMeCookie();
                          } else {
                              
          // Reset remember-me token
                              
          $this->deleteRememberMeCookie();
                          }

                          
          // OPTIONAL: recalculate the user's password hash
                          // DELETE this if-block if you like, it only exists to recalculate users's hashes when you provide a cost factor,
                          // by default the script will use a cost factor of 10 and never change it.
                          // check if the have defined a cost factor in config/hashing.php
                          
          if (defined('HASH_COST_FACTOR')) {
                              
          // check if the hash needs to be rehashed
                              
          if (password_needs_rehash($result_row->user_password_hashPASSWORD_DEFAULT, array('cost' => HASH_COST_FACTOR))) {

                                  
          // calculate new hash with new cost factor
                                  
          $user_password_hash password_hash($user_passwordPASSWORD_DEFAULT, array('cost' => HASH_COST_FACTOR));

                                  
          // TODO: this should be put into another method !?
                                  
          $query_update $this->db_connection->prepare('UPDATE users SET user_password_hash = :user_password_hash WHERE user_id = :user_id');
                                  
          $query_update->bindValue(':user_password_hash'$user_password_hashPDO::PARAM_STR);
                                  
          $query_update->bindValue(':user_id'$result_row->user_idPDO::PARAM_INT);
                                  
          $query_update->execute();

                                  if (
          $query_update->rowCount() == 0) {
                                      
          // writing new hash was successful. you should now output this to the user ;)
                                  
          } else {
                                      
          // writing new hash was NOT successful. you should now output this to the user ;)
                                  
          }
                              }
                          }
                      }
                  }
              } 
          PHP-Code:
              public function isUserLoggedIn()
              {
                  return 
          $this->user_is_logged_in;
              } 
          // write user data into PHP SESSION [a file on your server] -> ich denke hier ist was falsch ??? (LoginWithPostData())

          Kommentar


          • #6
            Nach erfolgreichem Logout sollte man natürlich noch wieder zu einer anderen Seite umgeleitet werden. Das wird es ja oder? Wenn nicht könnte es ja sein das irgenwo wieder "$this->user_is_logged_in;" auf true gesetzt wird beim Drücken des Back buttons.

            An dieser Methode loginWithPostData() kann es ja sicher nicht liegen, denn diese wird ja nur zum Login verwendet.

            Jedoch sehe ich ansonsten nichts was auf das Problem hindeutet. Einfach mal immer $this->user_is_logged_in ausgeben. Wenn da nach dem Back Button immer noch auf true gesetzt ist must du halt eben schauen wo das nicht klappt.

            Kommentar


            • #7
              logout_button_link = index.php?logout und ich frage ab, ob logout gesetzt ist und setze die daten dann auf false.

              so, das heisst es wäre sinnvoll eher eine eigene logout view zu erstellen mit einer eigenen routine? ich versuch das mal ...

              Kommentar


              • #8
                Ich vermute dein Problem rührt von Browser-Cache her. Mit dem zurück-Button läd der Browser das was im Cache liegt, wenn die Session zerstört ist und du auf dieser Seite anschließend was andrückst solltest du eigentlich wieder zu deiner Login-Seite gebracht werden

                PHP-Code:
                session_start();
                if(!isset(
                $_SESSION['isLoggedIn']))
                {
                    
                header("Location: www.domain.tld/login.php");
                    exit();

                - Laravel

                Kommentar


                • #9
                  Zitat von moloko Beitrag anzeigen
                  Das konkrete Problem besteht darin, dass nach einem erfolgreichen Login (Session user data) -> bei LOGOUT der user mit dem back Browser button wieder auf die Oberfläche gelangt.
                  Von allein oder nach erneuten Senden des (gespeicherten) Login-Formulars?
                  PHP-Klassen auf github

                  Kommentar


                  • #10
                    Das konkrete Problem besteht darin, dass nach einem erfolgreichen Login (Session user data) -> bei LOGOUT der user mit dem back Browser button wieder auf die Oberfläche gelangt.
                    Über dieses "Verhalten" gabs schon vieles an Stoff:
                    https://www.google.at/search?q=php+logount+browser+back

                    Ev. hilft dir ja sowas:
                    http://stackoverflow.com/questions/1...-after-log-out

                    LG
                    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                    PHP.de Wissenssammlung | Kein Support per PN

                    Kommentar


                    • #11
                      von alleine -> also ich logge mich nur ein (index.php) -> do_logout -> index.php?logut -> und drücke auf back_browser_btn und bin wieder auf der oberfläche (von index.php ).

                      zwischenzeitlich muss ich noch ein relaod machen, da werde ich gefragt ob ich die daten erneut senden möchte, und dann bin ich wieder auf der oberfläche (ich glaube das passiert aber wenn ich auf einer unterseite bin und mich von dieser auslogge also www.xx.de/unterseite -> do_logout -> www.xx.de/index.php?logout -> dann kommt der dialog bei drücken des browser_back_buttons)

                      Kommentar


                      • #12
                        da werde ich gefragt ob ich die daten erneut senden möchte
                        Ja dann machst du kein redirect wie tera3yte beschrieben hat

                        Kommentar

                        Lädt...
                        X