Безопасность
Этот компонент помогает разработчикам в выполнении общих задач безопасности, таких как хеширование паролей и защита от межсайтовых поддельных запросов (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
}
}
//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
}
}
}
}
Не забудьте добавить адаптер сессий в ваш Dependency Injector, иначе проверка токена не будет работать:
$di->setShared('session', function() {
$session = new Phalcon\Session\Adapter\Files();
$session->start();
return $session;
});
Также рекомендуется добавить капчу reCAPTCHA к форме, чтобы полностью избежать рисков этой атаки.
Настройка компонента
Этот компонент автоматически регистрируется в контейнере сервисов как ‘security’. Вы можете перерегистрировать его, чтобы настроить его параметры:
$di->set('security', function(){
$security = new Phalcon\Security();
//Set the password hashing factor to 12 rounds
$security->setWorkFactor(12);
return $security;
}, true);
Внешние ресурсы
- Vökuró, это пример приложения, которое использует компонент Security для защиты от CSRF и хеширования паролей, [Github]
© 2011–2016 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/2.0.0/reference/security.html