Безопасность
Этот компонент помогает разработчику в выполнении распространенных задач безопасности, таких как хеширование паролей и защита от межсайтовых поддельных запросов (CSRF).
Хеширование паролей
Хранение паролей в открытом виде — плохая практика безопасности. Любой, у кого есть доступ к базе данных, сразу получит доступ ко всем учетным записям пользователей, что позволит им выполнять несанкционированные действия. Для борьбы с этим многие приложения используют знакомые односторонние методы хеширования «md5» и «sha1». Однако аппаратное обеспечение развивается каждый день и становится быстрее, поэтому эти алгоритмы становятся уязвимыми для атак с применением силы. Эти атаки также известны как таблицы радуги.
Для решения этой проблемы можно использовать алгоритмы хеширования, такие как bcrypt. Почему bcrypt? Благодаря алгоритму настройки ключей «Eksblowfish» мы можем сделать шифрование пароля «медленным» насколько захотим. Медленные алгоритмы делают процесс вычисления реального пароля по хешу чрезвычайно сложным, если не невозможным. Это защитит ваши данные на длительное время от возможной атаки с использованием таблиц радуги.
Этот компонент позволяет использовать этот алгоритм простым способом:
use Phalcon\Mvc\Controller;
class UsersController extends Controller
{
public function registerAction()
{
$user = new Users();
$login = $this->request->getPost("login");
$password = $this->request->getPost("password");
$user->login = $login;
// Store the password hashed
$user->password = $this->security->hash($password);
$user->save();
}
}
Мы сохранили хешированный пароль с заданным значением work factor. Более высокое значение work factor сделает пароль менее уязвимым, так как его шифрование будет медленнее. Мы можем проверить, правильный ли пароль следующим образом:
use Phalcon\Mvc\Controller;
class SessionController extends Controller
{
public function loginAction()
{
$login = $this->request->getPost("login");
$password = $this->request->getPost("password");
$user = Users::findFirstByLogin($login);
if ($user) {
if ($this->security->checkHash($password, $user->password)) {
// The password is valid
}
} else {
// To protect against timing attacks. Regardless of whether a user exists or not, the script will take roughly the same amount as it will always be computing a hash.
$this->security->hash(rand());
}
// The validation has failed
}
}
Соль генерируется с помощью псевдослучайных байтов с помощью функции PHP openssl_random_pseudo_bytes, поэтому для ее работы требуется расширение openssl.
Защита от межсайтовых поддельных запросов (CSRF)
Это ещё одна распространенная атака на веб-сайты и приложения. Формы, предназначенные для выполнения задач, таких как регистрация пользователей или добавление комментариев, уязвимы для этой атаки.
Идея заключается в предотвращении отправки значений формы за пределы нашего приложения. Для решения этой проблемы мы генерируем случайный nonce (маркер) в каждой форме, добавляем маркер в сессию, а затем валидируем маркер после того, как форма отправит данные обратно в наше приложение, сравнивая сохраненный маркер в сессии с тем, который был отправлен формой:
<?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>
Затем в действии контроллера можно проверить, является ли CSRF-токен действительным:
use Phalcon\Mvc\Controller;
class SessionController extends Controller
{
public function loginAction()
{
if ($this->request->isPost()) {
if ($this->security->checkToken()) {
// The token is OK
}
}
}
}
Не забудьте добавить адаптер сессии в свой контейнер зависимостей, иначе проверка токена не будет работать:
$di->setShared(
"session",
function () {
$session = new \Phalcon\Session\Adapter\Files();
$session->start();
return $session;
}
);
Также рекомендуется добавить капчу на форму, чтобы полностью избежать рисков этой атаки.
Настройка компонента
Этот компонент автоматически регистрируется в контейнере сервисов как «security». Вы можете перерегистрировать его для настройки его параметров:
use Phalcon\Security;
$di->set(
"security",
function () {
$security = new Security();
// Set the password hashing factor to 12 rounds
$security->setWorkFactor(12);
return $security;
},
true
);
Случайные значения
Класс Phalcon\Security\Random делает генерацию различных типов случайных данных очень простым.
use Phalcon\Security\Random; $random = new Random(); // ... $bytes = $random->bytes(); // Generate a random hex string of length $len. $hex = $random->hex($len); // Generate a random base64 string of length $len. $base64 = $random->base64($len); // Generate a random URL-safe base64 string of length $len. $base64Safe = $random->base64Safe($len); // Generate a UUID (version 4). See https://en.wikipedia.org/wiki/Universally_unique_identifier $uuid = $random->uuid(); // Generate a random integer between 0 and $n. $number = $random->number($n);
Внешние ресурсы
- Vökuró, это демонстрационное приложение, использующее компонент безопасности для предотвращения CSRF и хеширования паролей, [Github]
© 2011–2017 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/latest/reference/security.html