Безопасное генерирование произвольных значений

Безопасное генерирование произвольных значений

Компонент Symfony Безопасность поставляется с коллекцией хороших утилит, связанных с безопасностью. Эти утилиты используются Symfony, но вы должны также использовать их, если вы хотите решить проблему, к которой они обращаются.

Note

Функции, описанные в этой статье, были представлены в PHP 5.6 или 7. Для более старых версий PHP, компоненет Symfony Полизаполнение предоставляет полизаполнение.

Сравнение строк

Время, которое требуется для сравнения двух строк, зависит от их различий. Это может быть использовано нападающим, когда две строки представляют пароль, например; это известно, как Атака по времени.

При сравнении двух паролей, вам стоит использовать функцию hash_equals:

1
2
3
if (hash_equals($knownString, $userInput)) {
    // ...
}

Генерирование безопасной произвольной строки

Если вам нужно сгенерировать безопасную произвольнкую строку, мы очень рекомендуем вам использовать функцию random_bytes:

1
$random = random_bytes(10);

Функция возвращает произвольную строку, подходящую для криптографического использования, количества байтов, переданных в качестве аргумента (10 в примере выше).

Tip

Функция random_bytes() возвращает бинарную строку, которая может содержать символ \0. Это может вызвать проблемы в нескольких распрстранённых сценариях, например при хранении этого значения в DB, или включении его в качестве части URL. Решением будет зашифровать или хеширвать значение, возвращённое random_bytes() (чтобы сделать это, вы можете использовать простую PHP функцию base64_encode()).

Генерирование безопасного произвольного числа

Если вам нужно сгенерировать криптографически безопасное произвольное целое число, используйте функцию random_int:

1
$random = random_int(1, 10);