Работа с паролями

Примечание: этот раздел находится на стадии разработки.

Хорошая безопасность является жизненно важной для жизни и успеха любого приложения. К сожалению, многие разработчики предпочитают упрощать, когда речь заходит о безопасности, либо из-за отсутствия понимания, либо потому, что считают реализацию слишком сложной. Для того, чтобы сделанное вами на Yii приложение было как можно более безопасным, в Yii есть несколько удобных и простых в использовании функций обеспечения безопасности.

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

Многие разработчики знают, что хранить пароль открытым текстом нельзя, но многие до сих пор считают безопасным использование для хеширования паролей md5 или sha1. Раньше упомянутых алгоритмов было достаточно, но современное оборудование позволяет подобрать эти хеши очень быстро, методом простого перебора.

Для того, чтобы обеспечить повышенную безопасность паролей ваших пользователей даже в худшем случае (ваше приложение взломано), нужно использовать алгоритм шифрования, устойчивый к атаке перебором. Лучший вариант в текущий момент bcrypt. В PHP вы можете использовать хеши bcrypt через функцию crypt. Yii обеспечивает две вспомогательные функции, которые упрощают использование функции crypt для генерации и проверки пароля.

Когда пользователь задаёт пароль (например во время регистрации), пароль должен быть захеширован:

$hash = Yii::$app->getSecurity()->generatePasswordHash($password);

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

Когда пользователь попытается войти, отправленный пароль должен быть хеширован и сравнён с ранее сохранённым хешем:

if (Yii::$app->getSecurity()->validatePassword($password, $hash)) {
    // всё хорошо, пользователь может войти
} else {
    // неправильный пароль
}

Генерация псевдослучайных данных

Псевдослучайные данные полезны во многих ситуациях. Например, для сброса пароля с помощью электронной почты вам необходимо сгенерировать специальный токен, сохранить его в БД, и отправить по почте конечному пользователю, который в свою очередь подтвердит им свою личность. Очень важно, чтобы этот маркер был уникальным и сложно подделываемым и злоумышленник не мог предсказать токен и сбросить пароль пользователя.

Помощник безопасности Yii делает генерацию псевдослучайных данных простой:

$key = Yii::$app->getSecurity()->generateRandomString();

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

Шифрование и Расшифровка

Yii предоставляет удобные вспомогательные функции, которые позволяют шифровать/дешифровать данные, используя секретный ключ. Данные, переданные в функцию шифрования, могут быть расшифрованы только человеком, имеющим секретный ключ. Например, нам нужно хранить некоторую информацию в базе данных, но мы должны быть уверены, что только пользователь, который имеет секретный ключ, сможет посмотреть их (даже если база данных будет скомпрометирована):

// $data и $secretKey передаются из формы
$encryptedData = Yii::$app->getSecurity()->encryptByPassword($data, $secretKey);
// сохраняем $encryptedData в базу данных

Позднее, когда пользователь захочет прочитать данные:

// $secretKey получается из формы, $encryptedData получается из базы данных
$data = Yii::$app->getSecurity()->decryptByPassword($encryptedData, $secretKey);

Подтверждение целостности данных

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

Префикс данных генерируются из секретного ключа и данных

// $secretKey получается от приложения или от пользователя, $genuineData получаются из надёжного источника
$data = Yii::$app->getSecurity()->hashData($genuineData, $secretKey);

Проверка целостности данных

// $secretKey получается от приложения или от пользователя, $data данные полученные из ненадёжного источника
$data = Yii::$app->getSecurity()->validateData($data, $secretKey);

todo: предотвращение XSS, CSRF, защита cookie, смотрите руководство 1.1

Вы также можете отключить проверку CSRF для контроллера и/или действия, через настройку его свойства:

namespace app\controllers;

use yii\web\Controller;

class SiteController extends Controller
{
    public $enableCsrfValidation = false;

    public function actionIndex()
    {
        // CSRF валидация не будет проводится для этого и других действий
    }

}

Чтобы отключить проверку CSRF в отдельном действии:

namespace app\controllers;

use yii\web\Controller;

class SiteController extends Controller
{
    public function beforeAction($action)
    {
        // ...установите здесь `$this->enableCsrfValidation` в зависимости от каких-то условий...
        // вызываем родительский метод для проверки CSRF если свойство установлено в `true`
        return parent::beforeAction($action);
    }
}

Безопасные Cookies

  • валидация
  • httpOnly по умолчанию

Смотрите также