Phalcon - Recursos de segurança

O Phalcon fornece recursos de segurança com a ajuda do componente Security, que ajuda a realizar certas tarefas como hashing de senha e Cross-Site Request Forgery (CSRF).

Senha de hash

Hashingpode ser definido como o processo de conversão de uma string de bits de comprimento fixo em um comprimento especificado de forma que não possa ser revertido. Qualquer mudança na string de entrada mudará o valor dos dados em hash.

A descriptografia de dados hash ocorre tomando o valor inserido pelo usuário como entrada e comparando a forma hash do mesmo. Normalmente, para qualquer aplicativo baseado na web, armazenar senhas como texto simples é uma prática ruim. Ele está sujeito a ataques de terceiros, pois quem tem acesso ao banco de dados pode facilmente obter senhas para qualquer usuário.

O Phalcon fornece uma maneira fácil de armazenar senhas de forma criptografada que segue um algoritmo como md5, base64 ou sh1.

Conforme visto nos capítulos anteriores, onde criamos um projeto para blogs. A tela de login aceita entrada como nome de usuário e senha para o usuário. Para receber as senhas do usuário e descriptografá-las em um formato específico, o seguinte trecho de código é usado.

A senha descriptografada é então combinada com a senha aceita como entrada do usuário. Se o valor corresponder, o usuário poderá efetuar login com êxito no aplicativo da web, caso contrário, uma mensagem de erro será exibida.

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

As senhas armazenadas no banco de dados estão em um formato criptografado de sh1 algoritmo.

Depois que o usuário insere um nome de usuário e uma senha apropriados, ele pode acessar o sistema, caso contrário, uma mensagem de erro é exibida como uma validação.

Cross-Site Request Forgery (CSRF)

É um ataque que força os usuários autenticados do aplicativo da web a executar certas ações indesejadas. Os formulários que aceitam entradas dos usuários são vulneráveis ​​a este ataque. O Phalcon tenta prevenir este ataque protegendo os dados que são enviados através de formulários externos ao aplicativo.

Os dados em cada formulário são protegidos com a ajuda da geração de tokens. O token gerado é aleatório e corresponde ao token para o qual estamos enviando os dados do formulário (principalmente fora do aplicativo da web por meio do método POST).

Código:

<?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 usar o adaptador de sessão ao enviar tokens de formulário, pois todos os dados serão mantidos na sessão.

Incluir adaptador de sessão em services.php usando o seguinte código.

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

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