Работа с паролями ================= > Примечание: этот раздел находится на стадии разработки. Хорошая безопасность является жизненно важной для жизни и успеха любого приложения. К сожалению, многие разработчики предпочитают упрощать, когда речь заходит о безопасности, либо из-за отсутствия понимания, либо потому, что считают реализацию слишком сложной. Для того, чтобы сделанное вами на Yii приложение было как можно более безопасным, в Yii есть несколько удобных и простых в использовании функций обеспечения безопасности. Хеширование и проверка пароля ----------------------------- Многие разработчики знают, что хранить пароль открытым текстом нельзя, но многие до сих пор считают безопасным использование для хеширования паролей `md5` или `sha1`. Раньше упомянутых алгоритмов было достаточно, но современное оборудование позволяет подобрать эти хеши очень быстро, методом простого перебора. Для того, чтобы обеспечить повышенную безопасность паролей ваших пользователей даже в худшем случае (ваше приложение взломано), нужно использовать алгоритм шифрования, устойчивый к атаке перебором. Лучший вариант в текущий момент `bcrypt`. В PHP вы можете использовать хеши `bcrypt` через [функцию crypt](http://php.net/manual/en/function.crypt.php). Yii обеспечивает две вспомогательные функции, которые упрощают использование функции `crypt` для генерации и проверки пароля. Когда пользователь задаёт пароль (например во время регистрации), пароль должен быть захеширован: ```php $hash = Yii::$app->getSecurity()->generatePasswordHash($password); ``` Хеш можно связать с соответствующим атрибутом модели, так чтобы он сохранялся в базе для последующего использования. Когда пользователь попытается войти, отправленный пароль должен быть хеширован и сравнён с ранее сохранённым хешем: ```php if (Yii::$app->getSecurity()->validatePassword($password, $hash)) { // всё хорошо, пользователь может войти } else { // неправильный пароль } ``` Генерация псевдослучайных данных -------------------------------- Псевдослучайные данные полезны во многих ситуациях. Например, для сброса пароля с помощью электронной почты вам необходимо сгенерировать специальный токен, сохранить его в БД, и отправить по почте конечному пользователю, который в свою очередь подтвердит им свою личность. Очень важно, чтобы этот маркер был уникальным и сложно подделываемым и злоумышленник не мог предсказать токен и сбросить пароль пользователя. Помощник безопасности Yii делает генерацию псевдослучайных данных простой: ```php $key = Yii::$app->getSecurity()->generateRandomString(); ``` Обратите внимание, что у вас должно быть установлено расширение `openssl` для генерации криптографически безопасных данных. Шифрование и Расшифровка ------------------------ Yii предоставляет удобные вспомогательные функции, которые позволяют шифровать/дешифровать данные, используя секретный ключ. Данные, переданные в функцию шифрования, могут быть расшифрованы только человеком, имеющим секретный ключ. Например, нам нужно хранить некоторую информацию в базе данных, но мы должны быть уверены, что только пользователь, который имеет секретный ключ, сможет посмотреть их (даже если база данных будет скомпрометирована): ```php // $data и $secretKey передаются из формы $encryptedData = Yii::$app->getSecurity()->encryptByPassword($data, $secretKey); // сохраняем $encryptedData в базу данных ``` Позднее, когда пользователь захочет прочитать данные: ```php // $secretKey получается из формы, $encryptedData получается из базы данных $data = Yii::$app->getSecurity()->decryptByPassword($encryptedData, $secretKey); ``` Подтверждение целостности данных -------------------------------- Есть ситуации, в которых вам нужно убедиться, что ваши данные не были подделаны третьей стороной, или как-то повреждены. Yii обеспечивает простой способ подтверждения целостности данных в виде двух вспомогательных функций. Префикс данных генерируются из секретного ключа и данных ```php // $secretKey получается от приложения или от пользователя, $genuineData получаются из надёжного источника $data = Yii::$app->getSecurity()->hashData($genuineData, $secretKey); ``` Проверка целостности данных ```php // $secretKey получается от приложения или от пользователя, $data данные полученные из ненадёжного источника $data = Yii::$app->getSecurity()->validateData($data, $secretKey); ``` todo: предотвращение XSS, CSRF, защита cookie, смотрите руководство 1.1 Вы также можете отключить проверку CSRF для контроллера и/или действия, через настройку его свойства: ```php namespace app\controllers; use yii\web\Controller; class SiteController extends Controller { public $enableCsrfValidation = false; public function actionIndex() { // CSRF валидация не будет проводится для этого и других действий } } ``` Чтобы отключить проверку CSRF в отдельном действии: ```php 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 по умолчанию Смотрите также -------------- - [Безопасность представлений](structure-views.md#security)