Ankündigung

Einklappen
Keine Ankündigung bisher.

Sichere authentifikation eines Users

Einklappen

Neue Werbung 2019

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

  • Sichere authentifikation eines Users

    Hi,

    also ich bastele an einem Login/Registrierungsskript.

    Nun geht es darum, den Besucher zu erkennen, wenn er die Seite wieder besucht:

    Ich habe mich in die Thematik mit Session und Cookie eingelesen.
    Vielle icht habe ich etwas übersehen aber ich entschied mich dafür, einen User anhand der Sessions wieder zu erkennen.

    Theoretisch ist es so:

    Wenn der User sich mit Logindaten erfolgreich eingeloggt hat, setze ich folgende Sessionvariable:
    $_SESSION['email_adresse'] = 'XY';

    $_SESSION['fingerprint'] = md5($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']);
    und
    timeout = 60*5; // 5 Minuten bis die Sitzung abgelaufen ist


    Die Überprüfung läuft dann in der Klasse CheckUser so ab:

    PHP-Code:
    function checkUser($last_active,$fingerprint){
            
            if ((
    $last_active < (time()-$this->timeout)) || ($fingerprint != $this->fingerprint)){
            
    //Sitzung abgelaufen oder die IP hat sich geändert
                
    $this->destroySession();
                 return 
    'default';
             }else{
    //kann noch eingeloggt bleiben
                 
    return 'loggedin';
             }
        }
    // End function 

    (Ich werde später die Überprüfung anhand der gespeicherten Daten in der Tabelle Session in der DB implementieren.)

    Ich bin mir aber noch nicht sicher, ob allein mit $fingerprint und $timeout so eine Authentifikation sicher gemacht wird.

    Gruß

  • #2
    Ich würde den Benutzer an Hand eines Secure Cookie permanent einloggen. Das Cookie selbst kann dann verschlüsselte Daten darüber enthalten, wie sich der Benutzer einloggt. Möchtest du mehr zu Security wissen, schau dir die Regeln des OWASP-Projektes an. Dort findest du Angriffs-Szenarien, gegen die du gewappnet sein solltest.
    Viele Grüße,
    Dr.E.

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    1. Think about software design [B]before[/B] you start to write code!
    2. Discuss and review it together with [B]experts[/B]!
    3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
    4. Write [I][B]clean and reusable[/B][/I] software only!
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Kommentar


    • #3
      Hi, sorry für die späte Antwort, war paar Tage nicht online.

      Also das mit secure cooky ist ein Konzept, darüber habe ich schon gelesen.
      Was mich bei Cookies stört, ist halt, dass wenn die Annahme von Cookie ausgeschaltet ist durch den Besucher.

      Insofern wäre doch da Session eine bessere Alternative?
      Anderseits Session kann ich jan nur auf dem Server speichern!

      Ich habe mal diese Klasse session geschrieben. Vielleicht finder einer Zeit sie durch zu gehen.
      Aber ich bin mir nicht sicher, ob mit Session alleine Authentication eines Users machbar ist.
      Ich habe es local getestet.


      PHP-Code:
      class session{
          
        private 
      $timeout
        private 
      $fingerprint;
        private 
      $mysqli;
        
          function 
      __construct(){
              
      //session_start();
              
      $this->mysqli db::getInstance();
              
      $this->timeout 60*1// 1 Minute
              
      $this->fingerprint md5($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']);
          }
          
          function 
      checkSession($requestEmail,$requestTimeout,$requestFingerprint){
              
      $sessionIdAlt session_id();
                  
               
      $query "SELECT fingerprint,timeout,user_id,email_address FROM sessions WHERE email_address = ? AND session_id = ?";
          
               if (
      $stmt $this->mysqli -> prepare($query)) {
                  
      //Parameter einbinden
                  
      $stmt -> bind_param("ss"$requestEmail$sessionIdAlt);
                  
      //ausführen
                  
      $stmt->execute();
                  
      //ergebnis einbinden
                  
      $stmt -> bind_result($fingerprint$timeout$user_id$email_address);
                  
                  
      $stmt->store_result();
                  
                  if(
      $stmt->affected_rows == 1){//Email und SessionID passt
                      
                    
      while($stmt->fetch()){
                      if ((
      time() > $timeout + ($this->timeout)) || ($requestFingerprint != $fingerprint)){
                          
      $this->destroySession($email_address);
                           return 
      1;
                           
                      }else{
                          
      //session_id regenieren
                          
      $this->updateSession($email_address);
                          return 
      2;
                       }
                      }
      //End while
                      
                  
      }//Ende Ergebnis gefunden
                  
      else{
                      return 
      3;
                  }
                  
      $stmt->free_result();
                  
      $stmt->close();
               }
      //End if prepare(query)
              //$this->mysqli->close();    
          
          
      }// End function
          
          
      function updateSession($email_address){
              
      $_SESSION['timeout'] = time();
              
      $_SESSION['fingerprint'] = $this->fingerprint;
              
      $_SESSION['email_address'] = $email_address;
              
      $sessionID session_id();
              
      $query "UPDATE sessions SET timeout = ?,fingerprint = ?,session_id = ? WHERE email_address = ?";
               
      $stmt $this->mysqli -> prepare($query);
              
      $stmt -> bind_param("ssss"$_SESSION['timeout'], $_SESSION['fingerprint'], $sessionID$email_address);
              
      //ausführen
              
      $stmt->execute();
              
      $stmt->close();
          }
      // End function
          
          
          
      function setSession($email){
               
      $query "SELECT session_id FROM sessions WHERE email_address = ?";
               
      $stmt $this->mysqli -> prepare($query);
               
      $stmt -> bind_param("s"$email);
              
      //ausführen
              
      $stmt->execute();
              
      $stmt->store_result();
                  if(
      $stmt->affected_rows == 1){//ID vorhanden
                      
      $this->updateSession($email);
                  }
      //End if 
                  
      else{
                      
      $_SESSION['timeout'] = time();
                      
      $_SESSION['fingerprint'] = $this->fingerprint;
                      
      $sessionID session_id();
                      
      $query "SELECT id FROM user WHERE email = ?";
                        if (
      $stmt $this->mysqli -> prepare($query)) {
                      
      //Parameter einbinden
                          
      $stmt -> bind_param("s"$email);
                      
      //ausführen
                          
      $stmt->execute();
                      
      //ergebnis einbinden
                          
      $stmt -> bind_result($id);
                      
                          
      $stmt->store_result();
                          if(
      $stmt->affected_rows == 1){//ID vorhanden
                              
      while($stmt->fetch()){
                                  
      $_SESSION['email_address'] = $email;
                                  
      $query "INSERT INTO sessions (`email_address`, `user_id`, `timeout`, `fingerprint`, `session_id`)
                                   VALUES (?, ?, ?, ?, ? )"
      ;
                                  
      $ergebnis $this->mysqli->prepare($query);
                                  
      $ergebnis -> bind_param("sisss"$email$id$_SESSION['timeout'], $_SESSION['fingerprint'], $sessionID);
                                  
      $ergebnis->execute();
                                  
      $ergebnis->close();
                              }
      //End while
                        
      }// End if
                        
      //End if prepare
                  
      }//End else
          
      }// End function
              
          
      function destroySession($email_address){
              
      $query "UPDATE sessions SET timeout = NULL, fingerprint = NULL, session_id = NULL WHERE email_address = ?";
              
      $ergebnis $this->mysqli->prepare($query);
              
      $ergebnis -> bind_param("s"$email_address);
              
      $ergebnis->execute();
              
      $ergebnis->close();
              
      session_destroy();
          }

      }
      // end Class
      ?> 

      Kommentar


      • #4
        Was hat die Klasse "session" nun mit den aufgezeigten Konzepten gemein? Ob du nun auf Cookies oder auf eine Http-Session setzt, die Session-ID wird zumeist ohnehin in einem Session-Cookie übertragen.
        Viele Grüße,
        Dr.E.

        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        1. Think about software design [B]before[/B] you start to write code!
        2. Discuss and review it together with [B]experts[/B]!
        3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
        4. Write [I][B]clean and reusable[/B][/I] software only!
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

        Kommentar


        • #5
          Ja hast schon recht. Die Überlegung war halt auf Sessions zu setzen, da Cookie-Annahme durch den Besucher womöglich nicht gesetzt ist.

          Ok alles klar und danke!

          Kommentar


          • #6
            Nochmal: Sichere Sessions basieren ohnehin auf Cookies. Auch technisch sind Sessions keine Cookie-Alternative, sondern ein anderes Konzept in einem anderen Kontext.
            [COLOR="#F5F5FF"]--[/COLOR]
            [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
            [COLOR="#F5F5FF"]
            --[/COLOR]

            Kommentar

            Lädt...
            X