|
|
|
@ -3,43 +3,42 @@
|
|
|
|
|
|
|
|
|
|
> Примечание: этот раздел находится на стадии разработки. |
|
|
|
|
|
|
|
|
|
Хорошая безопасность является жизненно важной для здоровья и успеха любого приложения. |
|
|
|
|
К сожалению, многие разработчики предпочитают срезать углы, когда речь заходит о безопасности, |
|
|
|
|
либо из-за отсутствия понимания или потому, что считают реализацию слишком сложным. |
|
|
|
|
Для того, чтобы сделанное вами на Yii приложение было как можно более безопасным, Yii включает несколько удобных |
|
|
|
|
и простых в использовании функции обеспечения безопасности. |
|
|
|
|
Хорошая безопасность является жизненно важной для жизни и успеха любого приложения. |
|
|
|
|
К сожалению, многие разработчики предпочитают упрощять, когда речь заходит о безопасности, |
|
|
|
|
либо из-за отсутствия понимания, либо потому, что считают реализацию слишком сложной. |
|
|
|
|
Для того, чтобы сделанное вами на Yii приложение было как можно более безопасным, в Yii есть несколько удобных |
|
|
|
|
и простых в использовании функций обеспечения безопасности. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Hashing and Verifying Passwords |
|
|
|
|
------------------------------- |
|
|
|
|
Хеширование и проверка пароля |
|
|
|
|
----------------------------- |
|
|
|
|
|
|
|
|
|
Многие разработчики знают, что хранить пароль открытым текстом нельзя, но многие до сих пор считают безопасным |
|
|
|
|
использование для хеширование паролей `md5` или `sha1`. Раньше упомянутых алгоритмов было достаточно, но современное |
|
|
|
|
оборудование позволяет подобрать эти хеши очень быстро, используя метод грубой силы. |
|
|
|
|
использование для хеширования паролей `md5` или `sha1`. Раньше упомянутых алгоритмов было достаточно, но современное |
|
|
|
|
оборудование позволяет подобрать эти хеши очень быстро, методом простого перебора. |
|
|
|
|
|
|
|
|
|
Для того, чтоб обеспечить повышенную безопасность паролей ваших пользователей даже в худшем случае (ваше |
|
|
|
|
Для того, чтобы обеспечить повышенную безопасность паролей ваших пользователей даже в худшем случае (ваше |
|
|
|
|
приложение взломано), нужно использовать алгоритм шифрования, устоичивый к атаке перебором. Лучший вариант в текущий |
|
|
|
|
момент `bcrypt`. В PHP вы можете использовать хеши `bcrypt` используя [функцию crypt](http://php.net/manual/en/function.crypt.php). |
|
|
|
|
Yii обеспечивает две вспомогательные функции, которые делают использование функции `crypt` для генерации и проверки |
|
|
|
|
пароля более простым. |
|
|
|
|
момент `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)) { |
|
|
|
|
// all good, logging user in |
|
|
|
|
// всё хорошо, пользователь может войти |
|
|
|
|
} else { |
|
|
|
|
// wrong password |
|
|
|
|
// неправильный пароль |
|
|
|
|
} |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
@ -47,11 +46,11 @@ if (Yii::$app->getSecurity()->validatePassword($password, $hash)) {
|
|
|
|
|
-------------------------------- |
|
|
|
|
|
|
|
|
|
Псевдослучайные данные полезны во многих ситуациях. Например, для сброса пароля с помощью электронной почты |
|
|
|
|
вам необходимо сгенерировать специальный токен, сохранить его в БД, и отправить его по почте конечному пользователю, |
|
|
|
|
который в свою очередь подтвердит им свою личность. Очень важно, что этот маркер должен быть уникальным и сложно |
|
|
|
|
подделываемым, чтоб злоумышленник не мог предсказать токен и сбросить пароль пользователя. |
|
|
|
|
вам необходимо сгенерировать специальный токен, сохранить его в БД, и отправить по почте конечному пользователю, |
|
|
|
|
который в свою очередь подтвердит им свою личность. Очень важно, чтобы этот маркер был уникальным и сложно |
|
|
|
|
подделываемым и злоумышленник не мог предсказать токен и сбросить пароль пользователя. |
|
|
|
|
|
|
|
|
|
Хелпер безопасности Yii делает генерацию псевдослучайных данных простой: |
|
|
|
|
Помощник безопасности Yii делает генерацию псевдослучайных данных простой: |
|
|
|
|
|
|
|
|
|
```php |
|
|
|
|
$key = Yii::$app->getSecurity()->generateRandomString(); |
|
|
|
@ -59,13 +58,13 @@ $key = Yii::$app->getSecurity()->generateRandomString();
|
|
|
|
|
|
|
|
|
|
Обратите внимание, что у вас должно быть установлено расширение `openssl` для генерации криптографически безопасных данных. |
|
|
|
|
|
|
|
|
|
Шифрование и Дешифровка |
|
|
|
|
----------------------- |
|
|
|
|
Шифрование и Расшифровка |
|
|
|
|
------------------------ |
|
|
|
|
|
|
|
|
|
Yii предоставляет удобные вспомогательные функции, которые позволяют шифровать/дешифровать данные используя секретный ключ. |
|
|
|
|
Данные переданные в функцию шифрования могут быть расшифрованы только человеком имеющим секретный ключ. Например, нам |
|
|
|
|
нужно хранить некоторую информацию в базе данных, но мы должны убедиться, что только пользователь, который имеет |
|
|
|
|
секретный ключ сможет посмотреть их (даже если база данных будет скомпрометирована): |
|
|
|
|
Yii предоставляет удобные вспомогательные функции, которые позволяют шифровать/дешифровать данные, используя секретный ключ. |
|
|
|
|
Данные, переданные в функцию шифрования, могут быть расшифрованы только человеком, имеющим секретный ключ. Например, нам |
|
|
|
|
нужно хранить некоторую информацию в базе данных, но мы должны быть уверены, что только пользователь, который имеет |
|
|
|
|
секретный ключ, сможет посмотреть их (даже если база данных будет скомпрометирована): |
|
|
|
|
|
|
|
|
|
```php |
|
|
|
|
// $data и $secretKey передаются из формы |
|
|
|
@ -83,7 +82,7 @@ $data = Yii::$app->getSecurity()->decryptByPassword($encryptedData, $secretKey);
|
|
|
|
|
Подтверждение целостности данных |
|
|
|
|
-------------------------------- |
|
|
|
|
|
|
|
|
|
Есть ситуации, в которых вам нужно убедится, что ваши данные не были подделаны третьей стороной, или как-то повреждены. |
|
|
|
|
Есть ситуации, в которых вам нужно убедиться, что ваши данные не были подделаны третьей стороной, или как-то повреждены. |
|
|
|
|
Yii обеспечивает простой способ подтверждения целостности данных в виде двух вспомогательных функций. |
|
|
|
|
|
|
|
|
|
Префикс данных генерируются из секретного ключа и данных |
|
|
|
|