Продолжаю публиковать интересное из недели backendsecret.
Все заметки с тегами «php, Безопасность»
-
Неделя backendsecret, часть 2
5 апреля 2019
-
mysql_real_escape_string() не защитит от SQL-инъекций
7 марта 2016
Вопреки древнему поверию, гласящему, что
mysql_real_escape_string()
защищает от SQL инъекций, функция этого не делает.Единственный, более-менее надёжный способ избежать SQL инъекций — использовать подготовленные запросы (prepared statements) с параметрами.
-
Случайные байты, числа и UUID в PHP
31 января 2016
Tom Worster, специалист по безопасности, помогающий поддерживать её в Yii на отличном уровне, поделился решениями для чистого PHP. Решения отличаются краткостью и отсутствием абстракции, что позволяет легко их проверить и избежать неприятных побочных эффектов.
-
Составные части хеш-строки 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. У него есть серия интересных постов на тему.
-
Современный брутфорс и безопасный логин
2 октября 2011
Оказывается, любой печатный восьмисимвольный пароль в домашних условиях ломается перебором всех комбинаций за три с половиной дня. Это при том, что хеширован он вполне современным sha256. Всего несколько лет назад на такой перебор могли уйти годы, а то и вся жизнь.
Что же теперь делать?
- Можно и нужно сделать лимит на количество попыток ввода пароля. По достижении лимита можно, например, просить ввести капчу. Однако, если произойдёт «утечка» базы данных, что, конечно, бывает не так часто, но бывает, ограничение не поможет.
- Хорошим решением будет в дополнение сделать вычисление хеша более ресурсоёмкой операцией. Пользователь не заметит, а вот для взломщика перебор станет, если не невозможным, то, как минимум, финансово невыгодным. Реализуется, например, при помощи bcrypt. Выглядеть это может примерно как здесь.
-
PHP, валидация и массивы
2 ноября 2009
Наверное, многие сталкивались с задачей ввода произвольного числа одноимённых полей через форму. В PHP это сделано довольно удобно: в форме к имени поля добавляется [] и на стороне сервера в $_POST, $_GET или $_REQUEST мы получаем уже массив.
В любом коде необходимо проверять данные, пришедшие из форм и адресной строки. В любом хорошем коде они проверяются. Но вот про эту особенность с квадратными скобками очень часто забывают.
http://example.com/list.php?q=test http://example.com/list.php?q[]=test
Довольно безобидный код, в котором нет проверки:
$q = null; if(!empty($_GET['q'])) { $q = $_GET['q']; } // тут начинаем работать с $q как со строкой
А вот менее безобидный пример: в WordPress до версии 2.8.4 можно было таким вот образом сгенерировать новый пароль администратора без отсылки ему каких-либо писем.
-
Роковые ошибки PHP
12 октября 2008
Описание распространённых и не очень уязвимостей PHP с примерами. Очень полезный материал для всех, кто хочет писать хороший защищённый код.