Почему не работает srand и mt_srand (PHP)

— О боже мой, они убили Кенни!
— Сволочи!
«Южный парк»

Псевдо/случайные числа

Случайные числа широко используются из соображений безопасности практически в каждой CMS. Вопросам получения случайных чисел посвящено уйма диссертаций и прочих научных трудов. Но вот на практике все решается простым вызовом функции php rand() или mt_rand(), в качестве результата отдающих случайное число (точнее псевдослучайное, но для простоты этот факт опустим)

Но прежде чем получить случайное число, генератор случайных чисел внутри функций rand и mt_rand следует инициализировать,  «посеять». Для этого необходимо вызвать фунциию srand() или mt_srand() с произвольным параметром.

void mt_srand ([ int $seed ] )
void srand ([ int $seed ] )

— изменяет начальное число генератора псевдослучайных чисел

Почему не работает srand и mt_srand

«Нет человека — нет проблемы»

Все бы хорошо, но поскольку получаемые после этого «случайные» числа зависят от параметра, с помощью которого был проинициализирован генератор случайных чисел, числа становятся не совсем не случайными. А последовательности — предсказуемыми. PHP-программисты же особо не заморачивались в эти тонкостях, создавали на этой основе системы безопасности. И этим воспользовались хитрые взломщики.
После того как эта дыра в безопасности стала известна широкой общественности, разработчики PHP долго не думая просто  отключили фунции инициализации srand и mt_srand. Совершенно забыв об обратной совместимости.

Функции mt_rand и srand теперь не работают. Будем разбираться…

«Это не баг, это фича»

Не всем нужна непредсказуемость. Псевдослучайность это — не баг, псевдослучайность это фича. Ведь инициализация хороша тем, что дает возможность создавать постоянные последовательности, которые можно весьма удачно использовать в SEO. Уберите инициализацию — и мир скрипты погрузятся в хаос.

Как это исправить?

За замену фунций случайных чисел отвечает модуль безопасности Suhosin Extension. Начиная с версий PHP 5.2.1 генератор случайных чисел заменен, а фунции srand() и mt_srand() в php не работают:

Since 5.2.1    The Mersenne Twister implementation in PHP now uses a new seeding algorithm by Richard Wagner. Identical seeds no longer produce the same sequence of values they did in previous versions. This behavior is not expected to change again, but it is considered unsafe to rely upon it nonetheless.

Для того чтобы включить функции srand и mt_srand необходимо изменить два следующих параметра в php.ini

suhosin.mt_srand.ignore    Off
suhosin.srand.ignore    Off

Проверить работу можно на следующем простом примере:

<?php

 srand(10);
 for ($i=0;$i<10;$i++)
   echo rand(0,99).' ';

 echo "<br>";

 mt_srand(10);
 for ($i=0;$i<10;$i++)
   echo mt_rand(0,99).' ';

?>

При новом алгоритме генерации случайных чисел, обновление страницы не даст изменения рядов чисел.

Просмотреть свою конфигурацию PHP всегда можно вызовом phpinfo()

<?php
phpinfo ();
?>

Инициализируйте на удачу ;)

Похожие записи:

Почему не работает srand и mt_srand (PHP): 1 комментарий

  1. Wordpress

    А чё-то в версии 5.5.3 его вообще уже не присутствует? Полностью вообще отсутствует раздел suhosin

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *