Полифил PHP 5.x для random_bytes()
и random_int()
созданный и поддерживаемый Paragon Initiative Enterprises.
Хотя эта библиотека должна работать в более ранних версиях PHP, мы будем рассматривать только проблемы, относящиеся к поддерживаемым версиям PHP. Если вы используете неподдерживаемую версию PHP, обновите ее как можно скорее.
Хотя эта библиотека была проверена некоторыми экспертами по безопасности в сообществе PHP, всегда остается вероятность, что мы что-то упустили из виду. Пожалуйста, попросите своих любимых доверенных хакеров проверить его на наличие ошибок и ошибок реализации, прежде чем даже думать о его внедрении в производство.
Не используйте ветку master, используйте стабильную версию.
Информацию об этой библиотеке можно найти в нашем блоге «Генерация случайных целых чисел и строк в PHP».
Если PHP не может безопасно генерировать случайные данные, эта библиотека выдаст Exception
. Он никогда не вернется к небезопасным случайным данным. Если это продолжает происходить, немедленно обновите PHP до более новой версии.
С композитором:
# For libraries and frameworks that support PHP 5 but may be used by # other software that only supports PHP 7: composer require paragonie/random_compat:>=2 # For software that explicitly needs PHP 5 support: composer require paragonie/random_compat:<9.99
Подписанный PHP-архив:
Начиная с версии 1.2.0, мы также поставляем PHP-архив, подписанный ECDSA, с каждым стабильным выпуском на Github.
Загрузите файлы .phar
, .phar.pubkey
и .phar.pubkey.asc
.
( Рекомендуется , но не обязательно) Проверьте подпись PGP для .phar.pubkey
(содержащуюся в файле .asc
), используя открытый ключ PGP для Paragon Initiative Enterprises.
Извлеките файлы .phar
и .phar.pubkey
в один и тот же каталог.
require_once "/path/to/random_compat.phar";
При выходе новой версии вам нужно только заменить файл .phar
; .pubkey
не изменится (если только наш ключ подписи не будет скомпрометирован).
Ручная установка:
Загрузите стабильную версию.
Извлеките файлы в свой проект.
require_once "/path/to/random_compat/lib/random.php";
Точкой входа должен быть непосредственно lib/random.php
, а не какой-либо другой файл в /lib
.
Эта библиотека предоставляет функции CSPRNG, добавленные в PHP 7, для использования в проектах PHP 5. Их поведение должно быть идентичным.
попробуйте {$string = random_bytes(32); } catch (TypeError $e) {// Ну, это целое число, так что это IS Sustainable.die("Произошла непредвиденная ошибка"); } catch (Error $e) {// Это также неожиданно, поскольку 32 — разумное целое число.die("Произошла непредвиденная ошибка"); } catch (Exception $e) {// Если вы получили это сообщение, CSPRNG не удалось hard.die("Не удалось сгенерировать случайную строку. Безопасна ли наша ОС?"); }var_dump(bin2hex($string));// string(64) "5787c41ae124b3b9363b7825104f8bc8cf27c4c3036573e5f0d4a91ad2eeac6f"
попробуйте {$int = random_int(0, 255); } catch (TypeError $e) {// Ну, это целое число, так что это ЯВЛЯЕТСЯ неожиданным.die("Произошла непредвиденная ошибка"); } catch (Error $e) {// Это также неожиданно, поскольку 0 и 255 являются целыми числами.die("Произошла непредвиденная ошибка"); } catch (Exception $e) {// Если вы получили это сообщение, CSPRNG не удалось выполнить hard.die("Не удалось сгенерировать случайное целое число. Безопасна ли наша ОС?"); }var_dump($int);// int(47)
При обработке исключений и ошибок необходимо учитывать различия между PHP 5 и PHP7.
Различия:
Перехват Error
работает, если он перехвачен до Exception
.
Перехват Exception
имеет другое поведение без предварительного перехвата Error
.
Не существует портативного способа отловить все ошибки/исключения.
Всегда перехватывайте Error
перед Exception
.
попробуйте {return random_int(1, $userInput); } catch (TypeError $e) {// Это нормально, если `Error` перехватывается до `Exception`.throw new Exception('Пожалуйста, введите число!'); } catch (Error $e) {// Это необходимо, если вам не нужно ничего делать, просто rethrow.throw $e; } catch (Exception $e) {// Это необязательно и может быть опущено, если вы не хотите обрабатывать ошибки // во время генерации. Throw new InternalServerErrorException('К сожалению, наш сервер неисправен и не может генерировать случайные данные.',500 ,$е); }
Если выдается исключение, ваша операционная система не защищена.
Если вы используете Windows, убедитесь, что вы включили mcrypt.
Если вы используете любую другую ОС, убедитесь, что /dev/urandom
доступен для чтения.
Джейлы FreeBSD должны предоставлять доступ /dev/urandom
из операционной системы хоста.
Если вы используете open_basedir
, убедитесь, что /dev/urandom
разрешен.
Эта библиотека не использует (и не будет принимать никаких патчей) использование небезопасного генератора случайных чисел.
Если вы используете проект, в композиторе которого есть такая строка
"require" { ... "paragonie/random_compat": "~1.1", ... }
... а затем вы попытаетесь добавить случайный_компат 2 (или другую библиотеку, которая явно требует случайного_компата 2, например эту безопасную библиотеку шифрования PHP), вы получите конфликт версий.
Решение состоит в том, чтобы заставить проект обновить свою строку требований, чтобы разрешить использование версии 2 и выше вместо жесткой блокировки пользователей до версии 1.
"требовать" { ...- "paragonie/random_compat": "~1.1",+ "paragonie/random_compat": ">=1",... }
Примечание . Существует специальная версия 9.99.99
, в которой эта библиотека ничего не делает, но ее можно установить только на PHP 7.
Если вы пишете программное обеспечение (например, библиотеку), которое поддерживает PHP 5, но может использоваться программами, которые его не поддерживают, вам следует разрешить установку 9.99.99
. Вышеупомянутая разница - это то, что вам нужно.
И наоборот, если вы пишете программное обеспечение, которое (само по себе) поддерживает PHP 5, вы не хотите, чтобы была установлена версия 9.99.99, поэтому вместо этого вам нужно внести следующее изменение:
"требовать" { ...- "paragonie/random_compat": "~1.1",+ "paragonie/random_compat": ">=1 <9.99",... }
Чтобы избежать установки «пустой» версии 9.99.99
вы можете добавить раздел replace
в корневой файл composer.json
:
"replace": { "paragonie/random_compat": "9.99.99" },
Если вы используете подход PHP Archive (Phar), а не Composer, и получаете сообщение об ошибке следующего содержания: «Длина чтения манифеста была {int1}
должна быть {int2}
», расширение Phar может быть не включено.
См. этот комментарий для получения конкретных рекомендаций по устранению этой проблемы.
Этот проект не был бы таким прекрасным, как сегодня, если бы не вклад следующих людей:
@AndrewCarterUK (Эндрю Картер)
@asgrim (Джеймс Титкамб)
@bcremer (Бенджамин Кремер)
@chriscct7 (Крис Кристофф)
@CodesInChaos (Кристиан Виннерляйн)
@ConnorVG (Коннор С. Паркс)
@cs278 (Крис Смит)
@cweagans (Кэмерон Иганс)
@ dd32 (Дион Халс)
@geggleto (Гленн Эгглтон)
@glensc (Элан Руусамяэ)
@GrahamCampbell (Грэм Кэмпбелл)
@ircmaxell (Энтони Феррара)
@jdevalk (Йост де Валк)
@jedisct1 (Фрэнк Денис)
@juliangut (Хулиан Гутьеррес)
@kelunik (Никлас Келлер)
@lt (Ли)
@MasonM (Мейсон Мэлоун)
@menkaff (Мехран НикНафс)
@mmeyer2k (Майкл М)
@narfbg (Андрей Андреев)
@nicolas-grekas (Николас Грекас)
@ocean90 (Доминик Шиллинг)
@oittaa
@oucil (Кевин Фарли)
@philios33 (Фил Николлс)
@redragonx (Стивен Чавес)
@relaxnow (Бой Баукема)
@rchouinard (Райан Шуинар)
@rugk
@SammyK (Сэмми Кэй Пауэрс)
@scottchiefbaker (Скотт Бейкер)
@skyosev (Стоян Кёсев)
@sthen (Стюарт Хендерсон)
@stof (Кристоф Кувуэт)
@teohhanhui (Тео Хан Хуэй)
@tom-- (Том Ворстер)
@tsyr2ko
@trowski (Аарон Пиотровски)
@twistor (Крис Лепаннен)
@vinkla (Винсент Клайбер)
@voku (Ларс Мёлекен)
@xabbuh (Кристиан Флотманн)
Если ваша компания использует эту библиотеку в своих продуктах или услугах, вы можете быть заинтересованы в приобретении контракта на поддержку у Paragon Initiative Enterprises.