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