Position actuelle: Accueil> Derniers articles> [Comment utiliser les fonctions Uniqid et MT_RAND pour générer un ID unique plus sûr?

[Comment utiliser les fonctions Uniqid et MT_RAND pour générer un ID unique plus sûr?

gitbox 2025-07-26

Fonction uniqid

La fonction Uniqid est l'une des fonctions intégrées de PHP, qui est utilisée pour générer un ID unique basé sur l'heure actuelle. Sa syntaxe est la suivante:

 <span><span><span class="hljs-title function_ invoke__">uniqid</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$prefix</span></span><span> = </span><span><span class="hljs-string">""</span></span><span>, </span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-variable">$more_entropy</span></span><span> = </span><span><span class="hljs-literal">false</span></span><span>): </span><span><span class="hljs-keyword">string</span></span><span>
</span></span>
  • $ Prefix : un paramètre de chaîne facultatif qui sera préfixé à l'ID unique généré.

  • $ More_entropy : la valeur booléenne, détermine s'il faut ajouter des caractères plus aléatoires à l'ID généré, augmenter sa complexité, par défaut en false .

La façon dont Uniqid est générée est basée sur l'horodatage actuel (microsecondes), qui a une haute précision, donc l'ID généré est unique dans la plupart des cas. Par exemple, appeler Uniqid () obtiendra un ID similaire à 5f5d5e5c8f1a7 .

défaut:

Bien que Uniqid génère des valeurs uniques basées sur l'heure actuelle, elle n'est pas très sûre. Étant donné que les horodatages se développent séquentiellement, si Uniqid est appelé plusieurs fois en même temps, l'ID généré peut être le même. De plus, l'ID généré par Uniqid par défaut est basé sur des horodatages, donc si l'attaquant peut prédire l'ordre dans lequel la croissance des horodatage augmente, l'ID généré devient facile à deviner.


Fonction MT_RAND

MT_RAND est un générateur de nombres pseudo-aléatoires dans PHP. Par rapport à la fonction RAND , MT_RAND est plus efficace et produit un nombre aléatoire de meilleure qualité. La syntaxe est la suivante:

 <span><span><span class="hljs-title function_ invoke__">mt_rand</span></span><span>(</span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$min</span></span><span> = PHP_INT_MIN, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$max</span></span><span> = PHP_INT_MAX): </span><span><span class="hljs-keyword">int</span></span><span>
</span></span>
  • $ min : La valeur minimale du nombre aléatoire généré, par défaut est php_int_min .

  • $ max : la valeur maximale du nombre aléatoire généré, par défaut est php_int_max .

MT_RAND renvoie un entier aléatoire dans la plage spécifiée, qui est pseudo-aléatoire, mais est suffisant pour les exigences générales de nombre aléatoire.

défaut:

Bien que MT_RAND soit très aléatoire, il est toujours pseudo-aléatoire et non un nombre aléatoire cryptographiquement sécurisé. Si l'ID généré doit être de haute sécurité (comme la prévention de la devinettes et des collisions), elle peut ne pas être suffisamment sécurisée.


Comment utiliser Uniqid et MT_RAND ?

Pour améliorer la sécurité de la génération d'ID unique, Uniqid et MT_RAND peuvent être utilisés ensemble. Cela garantit que l'ID généré ajoute un hasard à l'horodatage, ce qui améliore la difficulté des collisions.

Méthode de combinaison:

 <span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">generateSecureId</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$prefix</span></span></span><span> = </span><span><span class="hljs-string">""</span></span><span>) {
    </span><span><span class="hljs-comment">// Générer un temps unique basé sur ID</span></span><span>
    </span><span><span class="hljs-variable">$uniqid</span></span><span> = </span><span><span class="hljs-title function_ invoke__">uniqid</span></span><span>(</span><span><span class="hljs-variable">$prefix</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);
    
    </span><span><span class="hljs-comment">// Dans le seul ID Ajouter un nombre aléatoire</span></span><span>
    </span><span><span class="hljs-variable">$randomNumber</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mt_rand</span></span><span>(</span><span><span class="hljs-number">100000</span></span><span>, </span><span><span class="hljs-number">999999</span></span><span>);

    </span><span><span class="hljs-comment">// Unique généré par l&#39;épissage ID et nombres aléatoires</span></span><span>
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$uniqid</span></span><span> . </span><span><span class="hljs-variable">$randomNumber</span></span><span>;
}
</span></span>

Exemple de sortie:

 <span><span><span class="hljs-variable">$secureId</span></span><span> = </span><span><span class="hljs-title function_ invoke__">generateSecureId</span></span><span>(</span><span><span class="hljs-string">"order_"</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$secureId</span></span><span>;
</span></span>

La sortie peut ressembler à ceci:

 <span><span>order_60d17e5c5f1b4.829278031116635204001234
</span></span>

Dans la méthode ci-dessus, la fonction Uniqid génère une pièce unique basée sur le temps, tandis que MT_RAND ajoute un numéro de pseudo-aléatoire de haute qualité. L'ID combiné est plus difficile à prévoir, ce qui assure non seulement l'unicité de l'horodatage, mais évite également le problème de générer plusieurs ID identiques en même temps.


Pourquoi avons-nous besoin d'une combinaison d' Uniqid et MT_RAND ?

  1. Augmentation de l'aléatoire : L'ID généré par Uniqid sur la base des horodatages a un certain ordre et peut être spéculé par les attaquants. Les nombres aléatoires générés par MT_RAND augmentent l'imprévisibilité, ce qui rend les ID plus difficiles à deviner.

  2. Empêcher les collisions : utilisez Uniqid seul, si la différence de temps entre la génération d'ID est très petite, des collisions peuvent se produire (c'est-à-dire que l'ID généré est le même). L'introduction de MT_RAND ajoute des facteurs aléatoires et réduit efficacement la probabilité de collision.

  3. Améliorer la sécurité : dans certains scénarios (tels que les systèmes de paiement, la vérification des utilisateurs, etc.), les ID peuvent impliquer des informations sensibles ou doivent être empêchées d'être devinées. Si vous comptez uniquement sur Uniqid , il peut y avoir des risques de sécurité et l'ID généré sera encore plus imprévisible après avoir ajouté des nombres aléatoires MT_RAND .