Question Générateur de chaîne aléatoire PHP


J'essaye de créer une chaîne randomisée en PHP, et je n'ai absolument aucun résultat avec ceci:

<?php
function RandomString()
{
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randstring = '';
    for ($i = 0; $i < 10; $i++) {
        $randstring = $characters[rand(0, strlen($characters))];
    }
    return $randstring;
}
RandomString();
echo $randstring;

Qu'est-ce que je fais mal?


661
2017-12-04 22:56


origine


Réponses:


Pour répondre spécifiquement à cette question, deux problèmes:

  1. $randstring n'est pas dans la portée quand vous lui faites écho.
  2. Les caractères ne sont pas concaténés ensemble dans la boucle.

Voici un extrait de code avec les corrections:

function generateRandomString($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

Sortir la chaîne aléatoire avec l'appel ci-dessous:

// Echo the random string.
// Optionally, you can give it a desired string length.
echo generateRandomString();

Veuillez noter que cela génère des chaînes aléatoires prévisibles. Si vous voulez créer des jetons sécurisés, voir cette réponse.


1157
2017-12-04 22:57



Remarque: str_shuffle() utilisations internes rand(), qui ne convient pas à des fins de cryptographie (par exemple, générer des mots de passe aléatoires). Vous voulez un générateur de nombres aléatoires sécurisé au lieu. Il ne permet pas non plus de répéter les caractères.

Une autre façon.

ACTUALISÉ  (maintenant cela génère n'importe quelle longueur de chaîne):

function generateRandomString($length = 10) {
    return substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,$length);
}

echo  generateRandomString();  // OR: generateRandomString(24)

C'est tout. :)


324
2017-11-03 20:04



Il y a beaucoup de réponses à cette question, mais aucune d'entre elles ne Générateur de nombres pseudo-aléatoires cryptographiquement sécurisé (CSPRNG).

La réponse simple, sécurisée et correcte est d'utiliser RandomLib et ne réinventez pas la roue.

Pour ceux d'entre vous qui insistent pour inventer votre propre solution, PHP 7.0.0 fournira random_int() dans ce but; si vous êtes encore sur PHP 5.x, nous avons écrit un PHP 5 polyfill pour random_int() Vous pouvez donc utiliser la nouvelle API avant même de passer à PHP 7.

Générer en toute sécurité des entiers aléatoires en PHP Ce n'est pas une tâche triviale. Vous devriez toujours vérifier avec vos experts en cryptographie StackExchange résidents avant de déployer un algorithme développé en production.

Avec un générateur d'entiers sécurisé en place, générer une chaîne aléatoire avec un CSPRNG est une promenade dans le parc.

Création d'une chaîne sécurisée et aléatoire

/**
 * Generate a random string, using a cryptographically secure 
 * pseudorandom number generator (random_int)
 * 
 * For PHP 7, random_int is a PHP core function
 * For PHP 5.x, depends on https://github.com/paragonie/random_compat
 * 
 * @param int $length      How many characters do we want?
 * @param string $keyspace A string of all possible characters
 *                         to select from
 * @return string
 */
function random_str($length, $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
{
    $pieces = [];
    $max = mb_strlen($keyspace, '8bit') - 1;
    for ($i = 0; $i < $length; ++$i) {
        $pieces []= $keyspace[random_int(0, $max)];
    }
    return implode('', $pieces);
}

Usage:

$a = random_str(32);
$b = random_str(8, 'abcdefghijklmnopqrstuvwxyz');

Démo: https://3v4l.org/b4PST (Ignorer les échecs PHP 5, il a besoin de random_compat)


238
2018-06-29 03:41



Crée une chaîne hexdec longue de 20 caractères:

$string = bin2hex(openssl_random_pseudo_bytes(10)); // 20 chars

En PHP 7 (random_bytes ()):

$string = base64_encode(random_bytes(10)); // ~14 chars
// or
$string = bin2hex(random_bytes(10)); // 20 chars

108
2017-09-04 18:25



@tasmaniski: votre réponse a fonctionné pour moi. J'ai eu le même problème, et je le proposerais à ceux qui cherchent la même réponse. Ici, c'est de @tasmaniski:

<?php 
    $random = substr(md5(mt_rand()), 0, 7);
    echo $random;
?>

75
2018-02-10 08:24



En fonction de votre application (je voulais générer des mots de passe), vous pouvez utiliser

$string = base64_encode(openssl_random_pseudo_bytes(30));

Étant base64, ils peuvent contenir = ou - ainsi que les caractères demandés. Vous pouvez générer une chaîne plus longue, puis la filtrer et la découper pour la supprimer.

openssl_random_pseudo_bytes semble être le moyen recommandé pour générer un nombre aléatoire approprié en PHP. Pourquoi rand n'utilise pas /dev/random Je ne sais pas.


42
2018-02-06 17:40



Je sais que cela peut être un peu en retard pour le jeu, mais voici un simple doublure qui génère une vraie chaîne aléatoire sans aucune boucle de niveau de script ou utilisation de bibliothèques openssl.

echo substr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', mt_rand(1,10))),1,10);

Pour le décomposer afin que les paramètres soient clairs

// Character List to Pick from
$chrList = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

// Minimum/Maximum times to repeat character List to seed from
$chrRepeatMin = 1; // Minimum times to repeat the seed string
$chrRepeatMax = 10; // Maximum times to repeat the seed string

// Length of Random String returned
$chrRandomLength = 10;

// The ONE LINE random command with the above variables.
echo substr(str_shuffle(str_repeat($chrList, mt_rand($chrRepeatMin,$chrRepeatMax))),1,$chrRandomLength);

Cette méthode fonctionne en répétant aléatoirement la liste de caractères, puis mélange la chaîne combinée et renvoie le nombre de caractères spécifié.

Vous pouvez encore randomiser ceci, en randomisant la longueur de la chaîne retournée, en remplaçant $chrRandomLength avec mt_rand(8, 15) (pour une chaîne aléatoire entre 8 et 15 caractères).


25
2018-04-19 21:18



Une meilleure façon de mettre en œuvre cette fonction est:

function RandomString($length) {
    $keys = array_merge(range(0,9), range('a', 'z'));

    $key = "";
    for($i=0; $i < $length; $i++) {
        $key .= $keys[mt_rand(0, count($keys) - 1)];
    }
    return $key;
}

echo RandomString(20);

mt_rand est plus aléatoire selon ce et ce en php7. rand fonction est un alias de mt_rand.


24
2017-09-24 18:08



function generateRandomString($length = 15)
{
    return substr(sha1(rand()), 0, $length);
}

Tada!


22
2017-12-26 16:32



$randstring dans la portée de la fonction n'est pas la même que la portée où vous l'appelez. Vous devez affecter la valeur de retour à une variable.

$randstring = RandomString();
echo $randstring;

Ou juste en écho directement la valeur de retour:

echo RandomString();

De plus, dans votre fonction, vous avez une petite erreur. Dans la boucle for, vous devez utiliser .= donc chaque caractère est ajouté à la chaîne. En utilisant = vous l'écrasez avec chaque nouveau caractère au lieu de l'ajouter.

$randstring .= $characters[rand(0, strlen($characters))];

19
2017-12-04 22:59