Tom Worster, специалист по безопасности, помогающий поддерживать её в Yii на отличном уровне, поделился решениями для чистого PHP. Решения отличаются краткостью и отсутствием абстракции, что позволяет легко их проверить и избежать неприятных побочных эффектов.
Все заметки с тегом «Безопасность»
-
Случайные байты, числа и UUID в PHP
31 января 2016
-
Составные части хеш-строки bcrypt
26 ноября 2015
Хороший способ хранения данных для аутентификации — хеш-строки bcrypt. В PHP это реализуется при помощи crypt с алгоритмом blowfish. В более поздних версиях PHP — при помощи password_hash. В Yii для этого есть Security::generatePaswordHash(). Выглядит строка на выходе вот так:
$2y$13$YUUgrko03UmNU/fe6gNcO.Hka4lrdRlkq0iJ5d4bv4fK.sKS.6jXu
Длина в случае пароля всегда 60 символов.
- 2y - версия алгоритма bcrypt. Мы используем blowfish, так что в новых версиях PHP должна быть всегда
2y
. - 13 - cost. Стоимость вычислений. 2^13 итераций функции формирования ключа.
- Оставшееся — конкатенированные соль и хеш, закодированные через base64 с немного нестандартным набором символов. Первые 22 символа — 16 байт соли. Оставшееся — хеш.
При сравнении пароля bcrypt достаёт версию алгоритма, cost и соль из хеш-строки сохранённого пароля. Далее, используя их, вычисляет хеш нового пароля и сравнивает с сохранённым хешем.
- 2y - версия алгоритма bcrypt. Мы используем blowfish, так что в новых версиях PHP должна быть всегда
-
Уязвимость dev/random и других UNIX-устройств под Windows
20 октября 2015
12 комментариев -
Перестаньте использовать mcrypt
13 мая 2015
Сегодня в очередной раз всплыла статья об распространённых ошибках при реализации шифрования. Сама по себе она ничего так, но местами учит плохому. А именно, использовать mcrypt.
Почему его не стоит использовать
mcrypt не обновлялся более десяти лет и не планирует. Авторы его забросили. В нём есть серьёзные недоработки.
И что делать?
Мы в Yii от него ушли в сторону OpenSSL, чего и вам советую. Реализовал переход, в основном, Tom Worster. У него есть серия интересных постов на тему.
-
Проверяем и лечим ShellShock
1 октября 2014
Уже больше недели интернет полон сообщениями о всё новых уязвимостях в bash. Уязвимости серьёзные, их уже начинают активно эксплуатировать, надо обновляться.
Проверить наличие уязвимостей можно специальным скриптом и извне через специальный сервис, обновляться в каждой ОС немного по-разному. Для ubuntu это выглядит так:
sudo apt-get update && sudo apt-get install --only-upgrade bash
-
Yii 1.1.15 (исправление безопасности)
30 июня 2014
Вышел Yii 1.1.15, исправляющий проблему безопасности, найденную в 1.1.14. Более ранние версии не затронуты. Если вы используете его, следует обновиться. 1.1.15 полностью совместим с 1.1.14.
Уязвимость затрагивает
CDetailView
. Если ваше приложение берёт значениеvalue
от пользователя, то атакующий имеет возможность выполнить произвольный PHP скрипт на вашем сервере. Мы не раскрываем подробностей сразу чтобы дать время обновиться. По нашим данным детали пока известны только основной команде разработчиков фреймворка.Уязвимости присвоен номер CVE-2014-4672.
Забрать дистрибутив можно, как обычно, на yiiframework.com или обновиться через Composer.
-
Идентификация пользователя без cookie, Storage, flash и Java
21 августа 2013
Нашёлся интересный способ идентифицировать пользователя без использования cookie, какого-либо браузерного Storage, flash или Java и работающий при отключенном JavaScript за VPN.
Идея очень проста. Браузер может довольно длительное время хранить кеш. При использовании ETag клиент получает от сервера хеш, который кешируется вместе с данными и далее посылается обратно при каждом запросе этих данных. Пока данные не меняются, хеш посылается одинаковый, что позволяет идентифицировать пользователя.
-
Yii2, контроль доступа
25 июня 2013
В Yii 1.1 фильтр
accessControl
был очень гибким:// blacklist return array( array('deny', 'users' => array('*'), 'actions' => array('index'), ), ); //whitelist return array( array('allow', 'users' => array('*'), 'actions' => array('view'), ), array('deny'), );
Он позволял контролировать доступ как в стиле blacklist, так и whitelist. В Yii2 остался только whitelist. Это единственный нормальный и действительно безопасный подход в данной ситуации:
//whitelist public function behaviors() { return array( 'access' => array( 'class' => 'yii\web\AccessControl', 'rules' => array('allow' => true, 'users' => array('*'), 'actions' => array('view'), ), ), ); }
- https://github.com/yiisoft/yii2/issues/579.
- Basic principles of information protection, искать «b) Fail-safe defaults».
-
Приняли SHA-3
3 октября 2012
NIST принял решение, что же станет SHA-3. Из 64 конкурсантов был выбран Keccak. Выбирали пять лет.
SHA-2 пока не сломали, но то, что уже есть резервный вариант, радует. Тем более SHA-3 обсчитывается быстрее.
Ещё раз напомню, что использовать
SHA
иmd5
для хеширования паролей не стоит. -
Запомнить во всех браузерах
26 апреля 2012
Не так давно задался вопросом кроссбраузерного «запоминания» пользователя на сайте. Не потому, что действительно была такая потребность. Просто в пришло в голову и решил проверить, насколько это возможно. Оказывается, вполне возможно и даже применяется.
Логика подсказывает, что для того, чтобы несколько браузеров считали какое-то значение, значение должно быть установлено в нечто, которое всеми браузерами используется. Первым на ум приходит Flash. Его «Flash Cookie» или Local Shared Object оказывается вполне рабочим решением, которое используется, например, в Яндексе. Есть и в готовом виде с обёрткой для JavaScript.
Также стоит упомянуть evercookie. Штука очень «злая». Хранит информацию огромной кучей разных способов: обычные cookie, Flash, Silverlight, HTML5 LocalStorage и другие. Всего их 13. При попытке удаления части данных, библиотека их восстанавливает. Отлично должно подойти для отлова клонов, хотя, конечно, тут уже попахивает печеньками с тёмной стороны.