Случайные числа и строки в Bitrix D7: Security\Random вместо RandString
Зачем не mt_rand и не rand
Для промо-кодов, ссылок сброса пароля, антифрода и одноразовых токенов важнее не «выглядит случайным», а статистически устойчивая непредсказуемость. В D7 для этого закрепили фасад \Bitrix\Main\Security\Random: под капотом он опирается на криптографически пригодный источник энтропии (в современных сборках — через random_int / random_bytes и окружение PHP), а не на быстрый, но предсказуемый LCG.
Для выбора случайного элемента галереи или визуального «дрожания» на фронте по-прежнему хватает mt_rand, но для секретов держимся API ядра.
Целое в закрытом диапазоне
Границы включаются по смыслу «от … до …» так же, как и у random_int в PHP 7+:
use Bitrix\Main\Security\Random;
$weight = Random::getInt(6, 800);Если верхняя граница меньше нижней, ядро бросит исключение — это защищает от тихой подмены диапазона после рефакторинга.
Строка из букв и цифр
getString собирает последовательность заданной длины. Второй аргумент включает заглавные латинские буквы (по умолчанию они разрешены — смотрите сигнатуру в своей версии ядра).
use Bitrix\Main\Security\Random;
$shortCode = Random::getString(8, false); // false — без заглавных, точный состав символов см. код ядра своей версии
$mixedCase = Random::getString(12, true);Перед релизом сверьтесь с установленной веткой Битрикса: набор символов для getString исторически дополнялся, но идея метода — быстрый «читаемый» токен без ручного описания алфавита.
Битовые маски алфавита
Когда нужен явный контроль, используют getStringByAlphabet и константы пересечения множеств символов (цифры, строчные, прописные, спецсимволы — флаги суммируются через |):
use Bitrix\Main\Security\Random;
$apiKey = Random::getStringByAlphabet(
16,
Random::ALPHABET_NUM
| Random::ALPHABET_ALPHALOWER
| Random::ALPHABET_ALPHAUPPER
| Random::ALPHABET_SPECIAL
);Старайтесь не прошивать слишком жёсткий набор спецсимволов, если строка потом попадёт в URL или штрих-код: часть символов требует экранирования.
Один непрерывный набор символов
getStringByCharsets удобен, когда допустимые знаки задаётся одной строкой — классический кейс «как RandString, но безопаснее», например только hex:
use Bitrix\Main\Security\Random;
$hex32 = Random::getStringByCharsets(16, '0123456789abcdef');Несколько независимых классов символов
getStringByArray принимает массив строк-алфавитов. Реализация равномерно выбирает позиции так, чтобы итог содержал символы только из разрешённых множеств — удобно, если один блок — только цифры, второй — только латиница в нижнем регистре:
use Bitrix\Main\Security\Random;
$chunked = Random::getStringByArray(16, ['0123456789', 'abcdef']);Практические заметки
- Не храните сырую энтропию в логах: обрезайте значения или заменяйте на хэш для диагностики.
- Для человекочитаемых кодов избегайте путаницы
O/0иl/1— сузьте алфавит вручную черезgetStringByCharsets. - После крупного обновления ядра пробегитесь по модульным тестам, если опираетесь на второй аргумент
getString: поведение набора символов синхронизируется с официальной документацией релиза.
Итог
Security\Random — стандартная точка входа для генерации непредсказуемых значений в Битрикс D7: от коротких купонов до технических идентификаторов на кастомном алфавите.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии