Yandex Metrika
sanches.free 1 просмотр

Случайные числа и строки в 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 дней гарантии