Phalcon - Fonctions de sécurité

Phalcon fournit des fonctionnalités de sécurité à l'aide du composant de sécurité, qui aide à effectuer certaines tâches telles que le hachage de mot de passe et Cross-Site Request Forgery (CSRF).

Mot de passe de hachage

Hashingpeut être défini comme le processus de conversion d'une chaîne de bits de longueur fixe en une longueur spécifiée de telle sorte qu'elle ne puisse pas être inversée. Toute modification de la chaîne d'entrée modifiera la valeur des données hachées.

Le déchiffrement des données hachées a lieu en prenant la valeur entrée par l'utilisateur comme entrée et en comparant la forme de hachage de la même. Habituellement, pour toutes les applications Web, stocker les mots de passe sous forme de texte brut est une mauvaise pratique. Il est sujet aux attaques de tiers car ceux qui ont accès à la base de données peuvent facilement obtenir des mots de passe pour n'importe quel utilisateur.

Phalcon fournit un moyen simple de stocker les mots de passe sous forme cryptée qui suit un algorithme tel que md5, base64 ou sh1.

Comme vu dans les chapitres précédents, où nous avons créé un projet pour les blogs. L'écran de connexion accepte les entrées comme nom d'utilisateur et mot de passe pour l'utilisateur. Pour recevoir les mots de passe de l'utilisateur et les déchiffrer sous une forme particulière, l'extrait de code suivant est utilisé.

Le mot de passe déchiffré est alors mis en correspondance avec le mot de passe accepté comme entrée de l'utilisateur. Si la valeur correspond, l'utilisateur peut se connecter avec succès à l'application Web, sinon un message d'erreur s'affiche.

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

Les mots de passe stockés dans la base de données sont au format crypté de sh1 algorithme.

Une fois que l'utilisateur a entré un nom d'utilisateur et un mot de passe appropriés, l'utilisateur peut accéder au système, sinon un message d'erreur s'affiche en guise de validation.

Falsification de requêtes intersites (CSRF)

Il s'agit d'une attaque qui oblige les utilisateurs authentifiés de l'application Web à effectuer certaines actions indésirables. Les formulaires qui acceptent les entrées des utilisateurs sont vulnérables à cette attaque. Phalcon tente d'empêcher cette attaque en protégeant les données qui sont envoyées via des formulaires en dehors de l'application.

Les données de chaque formulaire sont sécurisées à l'aide de la génération de jetons. Le jeton généré est aléatoire et correspond au jeton auquel nous envoyons les données du formulaire (principalement en dehors de l'application Web via la méthode POST).

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 - Il est important d'utiliser l'adaptateur de session lors de l'envoi de jetons de formulaire, car toutes les données seront conservées dans la session.

Inclure l'adaptateur de session dans services.php en utilisant le code suivant.

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

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