Phalcon - Sicherheitsfunktionen

Phalcon bietet Sicherheitsfunktionen mithilfe der Sicherheitskomponente, die bei der Ausführung bestimmter Aufgaben wie Kennwort-Hashing und hilft Cross-Site Request Forgery (CSRF).

Hashing Passwort

Hashingkann definiert werden als der Prozess des Konvertierens einer Bitfolge fester Länge in eine bestimmte Länge, so dass sie nicht rückgängig gemacht werden kann. Jede Änderung in der Eingabezeichenfolge ändert den Wert der gehashten Daten.

Die Entschlüsselung von Hash-Daten erfolgt, indem der vom Benutzer eingegebene Wert als Eingabe verwendet und die Hash-Form derselben verglichen wird. Normalerweise ist das Speichern von Passwörtern als einfacher Text für webbasierte Anwendungen eine schlechte Praxis. Es ist anfällig für Angriffe von Drittanbietern, da diejenigen, die Zugriff auf die Datenbank haben, problemlos Kennwörter für jeden Benutzer beschaffen können.

Phalcon bietet eine einfache Möglichkeit, Passwörter in verschlüsselter Form zu speichern, die einem Algorithmus wie folgt md5, base64 oder sh1.

Wie in den vorherigen Kapiteln zu sehen, haben wir ein Projekt für Blogs erstellt. Der Anmeldebildschirm akzeptiert Eingaben als Benutzername und Passwort für den Benutzer. Um die Passwörter vom Benutzer zu erhalten und in einer bestimmten Form zu entschlüsseln, wird das folgende Codefragment verwendet.

Das entschlüsselte Passwort wird dann mit dem vom Benutzer als Eingabe akzeptierten Passwort abgeglichen. Wenn der Wert übereinstimmt, kann sich der Benutzer erfolgreich bei der Webanwendung anmelden. Andernfalls wird eine Fehlermeldung angezeigt.

<?php  
class UsersController extends Phalcon\Mvc\Controller {  
   public function indexAction() {  
   }  
   public function registerUser() { 
      $user = new Users();  
      $login    = $this->request->getPost("login"); 
      $password = $this->request->getPost("password");
      $user->login = $login;  
      
      // Store the hashed pasword 
      $user->password = $this->security->sh1($password);  
      $user->save(); 
   }  
   public function loginAction() {  
      if ($this->request->isPost()) {  
         $user = Users::findFirst(array( 
            'login = :login: and password = :password:', 
            'bind' => array( 
               'login' => $this->request->getPost("login"), 
               'password' => sha1($this->request->getPost("password")) 
            ) 
         ));  
         if ($user === false) { 
            $this->flash->error("Incorrect credentials"); 
            return $this->dispatcher->forward(array( 
               'controller' => 'users', 
               'action' => 'index' 
            )); 
         }
         $this->session->set('auth', $user->id);  
         $this->flash->success("You've been successfully logged in"); 
      }  
      return $this->dispatcher->forward(array( 
         'controller' => 'posts', 
         'action' => 'index' 
      )); 
   }  
   public function logoutAction() { 
      $this->session->remove('auth'); 
      return $this->dispatcher->forward(array( 
         'controller' => 'posts', 
         'action' => 'index' 
      )); 
   }  
}

Die in der Datenbank gespeicherten Passwörter haben ein verschlüsseltes Format von sh1 Algorithmus.

Sobald der Benutzer einen geeigneten Benutzernamen und ein Kennwort eingegeben hat, kann er auf das System zugreifen. Andernfalls wird eine Fehlermeldung als Validierung angezeigt.

Cross-Site Request Forgery (CSRF)

Es ist ein Angriff, der authentifizierte Benutzer von Webanwendungen dazu zwingt, bestimmte unerwünschte Aktionen auszuführen. Formulare, die Eingaben von Benutzern akzeptieren, sind für diesen Angriff anfällig. Phalcon versucht, diesen Angriff zu verhindern, indem es die Daten schützt, die über Formulare außerhalb der Anwendung gesendet werden.

Die Daten in jedem Formular werden mit Hilfe der Token-Generierung gesichert. Das generierte Token ist zufällig und wird mit dem Token abgeglichen, an das wir die Formulardaten senden (meistens außerhalb der Webanwendung über die POST-Methode).

Code:

<?php echo Tag::form('session/login') ?>  
   <!-- Login and password inputs ... -->  
   <input type = "hidden" name = "<?php echo $this->security->getTokenKey() ?>" 
      value = "<?php echo $this->security->getToken() ?>"/>  
</form>

Note - Es ist wichtig, beim Senden von Formulartoken einen Sitzungsadapter zu verwenden, da alle Daten in der Sitzung beibehalten werden.

Sitzungsadapter einbinden in services.php mit dem folgenden Code.

/** 
   * Start the session the first time some component request the session service 
*/ 

$di->setShared('session', function () { 
   $session = new SessionAdapter(); 
   $session->start();  
   return $session; 
});