Продолжаю публиковать интересное из недели backendsecret.
Все заметки с тегами «php, Безопасность»
- 
	Неделя backendsecret, часть 25 апреля 2019 Комментировать
- 
	mysql_real_escape_string() не защитит от SQL-инъекций7 марта 2016 19 комментариевВопреки древнему поверию, гласящему, что mysql_real_escape_string()защищает от SQL инъекций, функция этого не делает.Единственный, более-менее надёжный способ избежать SQL инъекций — использовать подготовленные запросы (prepared statements) с параметрами. 
- 
	Случайные байты, числа и UUID в PHP31 января 2016 КомментироватьTom Worster, специалист по безопасности, помогающий поддерживать её в Yii на отличном уровне, поделился решениями для чистого PHP. Решения отличаются краткостью и отсутствием абстракции, что позволяет легко их проверить и избежать неприятных побочных эффектов. 
- 
	Составные части хеш-строки bcrypt26 ноября 2015 5 комментариевХороший способ хранения данных для аутентификации — хеш-строки 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-устройств под Windows20 октября 2015 12 комментариев
- 
	Перестаньте использовать mcrypt13 мая 2015 8 комментариевСегодня в очередной раз всплыла статья об распространённых ошибках при реализации шифрования. Сама по себе она ничего так, но местами учит плохому. А именно, использовать mcrypt. Почему его не стоит использоватьmcrypt не обновлялся более десяти лет и не планирует. Авторы его забросили. В нём есть серьёзные недоработки. И что делать?Мы в Yii от него ушли в сторону OpenSSL, чего и вам советую. Реализовал переход, в основном, Tom Worster. У него есть серия интересных постов на тему. 
- 
	Современный брутфорс и безопасный логин2 октября 2011 27 комментариевОказывается, любой печатный восьмисимвольный пароль в домашних условиях ломается перебором всех комбинаций за три с половиной дня. Это при том, что хеширован он вполне современным sha256. Всего несколько лет назад на такой перебор могли уйти годы, а то и вся жизнь. Что же теперь делать? - Можно и нужно сделать лимит на количество попыток ввода пароля. По достижении лимита можно, например, просить ввести капчу. Однако, если произойдёт «утечка» базы данных, что, конечно, бывает не так часто, но бывает, ограничение не поможет.
- Хорошим решением будет в дополнение сделать вычисление хеша более ресурсоёмкой операцией. Пользователь не заметит, а вот для взломщика перебор станет, если не невозможным, то, как минимум, финансово невыгодным. Реализуется, например, при помощи bcrypt. Выглядеть это может примерно как здесь.
 
- 
	PHP, валидация и массивы2 ноября 2009 3 комментарияНаверное, многие сталкивались с задачей ввода произвольного числа одноимённых полей через форму. В 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 можно было таким вот образом сгенерировать новый пароль администратора без отсылки ему каких-либо писем. 
- 
	Роковые ошибки PHP12 октября 2008 КомментироватьОписание распространённых и не очень уязвимостей PHP с примерами. Очень полезный материал для всех, кто хочет писать хороший защищённый код. 



