Yii2 framework backup
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

153 lines
8.5 KiB

Работа с паролями
=================
> Note: этот раздел находится на стадии разработки.
10 years ago
Хорошая безопасность является жизненно важной для жизни и успеха любого приложения.
К сожалению, многие разработчики предпочитают упрощать, когда речь заходит о безопасности,
10 years ago
либо из-за отсутствия понимания, либо потому, что считают реализацию слишком сложной.
Для того, чтобы сделанное вами на Yii приложение было как можно более безопасным, в Yii есть несколько удобных
и простых в использовании функций обеспечения безопасности.
10 years ago
Хеширование и проверка пароля
-----------------------------
Многие разработчики знают, что хранить пароль открытым текстом нельзя, но многие до сих пор считают безопасным
10 years ago
использование для хеширования паролей `md5` или `sha1`. Раньше упомянутых алгоритмов было достаточно, но современное
оборудование позволяет подобрать эти хеши очень быстро, методом простого перебора.
10 years ago
Для того, чтобы обеспечить повышенную безопасность паролей ваших пользователей даже в худшем случае (ваше
приложение взломано), нужно использовать алгоритм шифрования, устойчивый к атаке перебором. Лучший вариант в текущий
10 years ago
момент `bcrypt`. В PHP вы можете использовать хеши `bcrypt` через [функцию crypt](http://php.net/manual/en/function.crypt.php).
Yii обеспечивает две вспомогательные функции, которые упрощают использование функции `crypt` для генерации и проверки
пароля.
10 years ago
Когда пользователь задаёт пароль (например во время регистрации), пароль должен быть захеширован:
```php
$hash = Yii::$app->getSecurity()->generatePasswordHash($password);
```
Хеш можно связать с соответствующим атрибутом модели, так чтобы он сохранялся в базе для последующего использования.
Когда пользователь попытается войти, отправленный пароль должен быть хеширован и сравнён с ранее сохранённым хешем:
```php
if (Yii::$app->getSecurity()->validatePassword($password, $hash)) {
10 years ago
// всё хорошо, пользователь может войти
} else {
10 years ago
// неправильный пароль
}
```
Генерация псевдослучайных данных
--------------------------------
Псевдослучайные данные полезны во многих ситуациях. Например, для сброса пароля с помощью электронной почты
10 years ago
вам необходимо сгенерировать специальный токен, сохранить его в БД, и отправить по почте конечному пользователю,
который в свою очередь подтвердит им свою личность. Очень важно, чтобы этот маркер был уникальным и сложно
подделываемым и злоумышленник не мог предсказать токен и сбросить пароль пользователя.
10 years ago
Помощник безопасности Yii делает генерацию псевдослучайных данных простой:
```php
$key = Yii::$app->getSecurity()->generateRandomString();
```
Обратите внимание, что у вас должно быть установлено расширение `openssl` для генерации криптографически безопасных данных.
10 years ago
Шифрование и Расшифровка
------------------------
10 years ago
Yii предоставляет удобные вспомогательные функции, которые позволяют шифровать/дешифровать данные, используя секретный ключ.
Данные, переданные в функцию шифрования, могут быть расшифрованы только человеком, имеющим секретный ключ. Например, нам
нужно хранить некоторую информацию в базе данных, но мы должны быть уверены, что только пользователь, который имеет
секретный ключ, сможет посмотреть их (даже если база данных будет скомпрометирована):
```php
// $data и $secretKey передаются из формы
$encryptedData = Yii::$app->getSecurity()->encryptByPassword($data, $secretKey);
// сохраняем $encryptedData в базу данных
```
Позднее, когда пользователь захочет прочитать данные:
```php
// $secretKey получается из формы, $encryptedData получается из базы данных
$data = Yii::$app->getSecurity()->decryptByPassword($encryptedData, $secretKey);
```
Подтверждение целостности данных
--------------------------------
10 years ago
Есть ситуации, в которых вам нужно убедиться, что ваши данные не были подделаны третьей стороной, или как-то повреждены.
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)