Comment générer une chaîne de caractères (string) aléatoire (random) en PHP ?

La méthode la plus simple pour générer une chaîne aléatoire consiste à partir d'une chaîne de caractères qui contient tous les caractères possibles.

Le langage PHP fournit des fonctions permettant de générer des nombres aléatoires. Il est possible d'utiliser ces fonctions pour générer une chaîne de caractères aléatoire. La méthode et les fonctions à utiliser diffèrent cependant selon vos besoins en matière de sécurité.

La méthode la plus simple pour générer une chaîne aléatoire consiste à partir d'une chaîne de caractères qui contient tous les caractères possibles. Dans une boucle, on récupère un caractère aléatoire avec la fonction rand(). Cette fonction génère un nombre aléatoire compris entre deux limites passées en argument. On utilise ici 0 et la longueur maximale de la chaîne contenant tous les caractères.

function genererChaineAleatoire($longueur = 10)
{
 $caracteres = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
 $longueurMax = strlen($caracteres);
 $chaineAleatoire = '';
 for ($i = 0; $i < $longueur; $i++)
 {
 $chaineAleatoire .= $caracteres[rand(0, $longueurMax - 1)];
 }
 return $chaineAleatoire;
}
//Utilisation de la fonction
echo genererChaineAleatoire();
echo genererChaineAleatoire(20);

Cette méthode ne doit cependant pas être utilisée pour des problématiques de sécurité. Elle génère des chaînes de caractères prévisibles, qui peuvent être trouvées par des hackers.

Une méthode plus rapide consiste à utiliser des méthodes de manipulation des chaînes de caractères fournis par PHP. On répète d'abord la chaîne contenant tous les caractères possibles avec la fonction str_repeat(), pour les cas où il faudrait une chaîne plus longue que tous les caractères réunis. On mélange ensuite aléatoirement les caractères de la chaîne répétée avec la fonction str_shuffle(). Pour terminer, on découpe la chaîne mélangée avec la fonction substr() afin de ne récupérer que le nombre de caractères nécessaire.

function genererChaineAleatoire($longueur = 10)
{
 return substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($longueur/strlen($x)) )),1,$longueur);
}
//Utilisation de la fonction
echo genererChaineAleatoire();
echo genererChaineAleatoire(20);

Comme pour la solution précédente, cette méthode génère des chaînes de caractères prévisibles, qui ne sont pas sécurisées. Cette fonction génère des chaînes de caractères dans lesquelles un caractère ne peut pas se répéter (pour les cas où la longueur demandée est inférieure à la longueur de la chaîne contenant tous les caractères possibles).

Si vous souhaitez générer des chaînes de caractères sécurisées, il faut utiliser la méthode de génération de nombre aléatoire cryptographique. Cette méthode génère un nombre dont on ne peut pas prévenir la valeur. Cette méthode rend ainsi la chaîne de caractères imprévisible et renforce la sécurité. A partir de PHP7, la fonction random_int() génère un nombre aléatoire sécurisé.

function genererChaineAleatoire($longueur, $listeCar = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
{
 $chaine = '';
 $max = mb_strlen($listeCar, '8bit') - 1;
 for ($i = 0; $i < $longueur; ++$i) {
 $chaine .= $listeCar[random_int(0, $max)];
 }
 return $chaine;
}
//Utilisation de la fonction
echo genererChaineAleatoire();
echo genererChaineAleatoire(20, 'abcdefghijklmnopqrstuvwxyz');

Si votre serveur exécute une version antérieure de PHP, il existe une librairie qui ajoute ces fonctions. Elle est disponible pour les versions de PHP allant de la version 5.2 à la version 5.6. Il s'agit de la librairie random_compat. Il faut l'inclure avant d'utiliser cette fonction.

PHP