Phalcon - Функции безопасности

Phalcon предоставляет функции безопасности с помощью компонента безопасности, который помогает в выполнении определенных задач, таких как хеширование паролей и Cross-Site Request Forgery (CSRF).

Хеширование пароля

Hashingможно определить как процесс преобразования битовой строки фиксированной длины в заданную длину таким образом, чтобы ее нельзя было обратить. Любое изменение во входной строке изменит значение хешированных данных.

Расшифровка хешированных данных происходит путем использования значения, введенного пользователем, в качестве входных данных и сравнения его хеш-формы. Обычно для любых веб-приложений хранение паролей в виде простого текста - плохая практика. Он подвержен сторонним атакам, поскольку те, у кого есть доступ к базе данных, могут легко получить пароли для любого пользователя.

Phalcon предоставляет простой способ хранить пароли в зашифрованном виде, который следует алгоритму вроде md5, base64 или же sh1.

Как было показано в предыдущих главах, мы создали проект для блогов. Экран входа в систему принимает ввод в качестве имени пользователя и пароля для пользователя. Чтобы получить пароль от пользователя и расшифровать его в определенной форме, используется следующий фрагмент кода.

Затем расшифрованный пароль сопоставляется с паролем, принятым в качестве ввода от пользователя. Если значение совпадает, пользователь может успешно войти в веб-приложение, иначе появится сообщение об ошибке.

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

Пароли, хранящиеся в базе данных, находятся в зашифрованном формате sh1 алгоритм.

Как только пользователь вводит соответствующее имя пользователя и пароль, он может получить доступ к системе, в противном случае отображается сообщение об ошибке в качестве подтверждения.

Подделка межсайтовых запросов (CSRF)

Это атака, которая заставляет аутентифицированных пользователей веб-приложения выполнять определенные нежелательные действия. Формы, которые принимают ввод от пользователей, уязвимы для этой атаки. Phalcon пытается предотвратить эту атаку, защищая данные, которые отправляются через формы за пределами приложения.

Данные в каждой форме защищены с помощью генерации токенов. Генерируемый токен является случайным и сопоставляется с токеном, на который мы отправляем данные формы (в основном за пределами веб-приложения через метод POST).

Код:

<?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 - Важно использовать адаптер сеанса при отправке токенов формы, так как все данные будут сохранены в сеансе.

Включить адаптер сеанса в services.php используя следующий код.

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

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