Phalcon - Funzionalità di sicurezza

Phalcon fornisce funzionalità di sicurezza con l'aiuto del componente Security, che aiuta nell'esecuzione di determinate attività come l'hashing delle password e Cross-Site Request Forgery (CSRF).

Hashing della password

Hashingpuò essere definito come il processo di conversione di una stringa di bit di lunghezza fissa in una lunghezza specificata in modo tale da non poter essere invertita. Qualsiasi modifica nella stringa di input cambierà il valore dei dati sottoposti a hashing.

La decrittazione dei dati hash avviene prendendo il valore inserito dall'utente come input e confrontando la forma hash dello stesso. Di solito per qualsiasi applicazione basata sul Web, memorizzare le password come testo normale è una cattiva pratica. È soggetto ad attacchi di terze parti poiché coloro che hanno accesso al database possono facilmente procurarsi password per qualsiasi utente.

Phalcon fornisce un modo semplice per memorizzare le password in forma crittografata che segue un algoritmo come md5, base64 o sh1.

Come visto nei capitoli precedenti, dove abbiamo creato un progetto per i blog. La schermata di accesso accetta input come nome utente e password per l'utente. Per ricevere le password dall'utente e decrittografarle in una forma particolare, viene utilizzato il seguente frammento di codice.

La password decrittografata viene quindi abbinata alla password accettata come input dall'utente. Se il valore corrisponde, l'utente può accedere con successo all'applicazione web altrimenti viene visualizzato un messaggio di errore.

<?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' 
      )); 
   }  
}

Le password memorizzate nel database sono in un formato crittografato di sh1 algoritmo.

Una volta che l'utente immette un nome utente e una password appropriati, può accedere al sistema, altrimenti viene visualizzato un messaggio di errore come convalida.

Cross-Site Request Forgery (CSRF)

Si tratta di un attacco che obbliga gli utenti autenticati dell'applicazione Web a eseguire determinate azioni indesiderate. I moduli che accettano input dagli utenti sono vulnerabili a questo attacco. Phalcon cerca di prevenire questo attacco proteggendo i dati inviati tramite moduli esterni all'applicazione.

I dati in ogni forma sono protetti con l'aiuto della generazione di token. Il token generato è casuale ed è abbinato al token a cui stiamo inviando i dati del modulo (principalmente all'esterno dell'applicazione web tramite il metodo POST).

Codice:

<?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 - È importante utilizzare l'adattatore di sessione durante l'invio di token di modulo, poiché tutti i dati verranno mantenuti nella sessione.

Includi adattatore di sessione in services.php utilizzando il codice seguente.

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

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