Phalcon предоставляет функции безопасности с помощью компонента Security, который помогает выполнять определенные задачи, такие как хеширование паролей и подделка межсайтовых запросов (CSRF).
Хеширование пароля
Хеширование может быть определено как процесс преобразования битовой строки фиксированной длины в указанную длину таким образом, что ее нельзя перевернуть. Любое изменение во входной строке изменит значение хешированных данных.
Расшифровка хешированных данных происходит путем взятия значения, введенного пользователем, в качестве ввода и сравнения его хеш-формы. Обычно для любых веб-приложений хранение паролей в виде простого текста является плохой практикой. Он подвержен сторонним атакам, поскольку те, кто имеет доступ к базе данных, могут легко получить пароли для любого пользователя.
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>
Примечание. При отправке токенов формы важно использовать адаптер сеанса, поскольку все данные будут сохраняться в сеансе.
Включите сессионный адаптер в services.php, используя следующий код.