995 Stimmen

PHP-Zufallsstring-Generator

Ich versuche, eine randomisierte Zeichenfolge in PHP zu erstellen, und ich bekomme absolut keine Ausgabe mit diesem:

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

    RandomString();
    echo $randstring;

Was mache ich falsch?

1630voto

Stephen Watkins Punkte 24097

Um diese Frage konkret zu beantworten, gibt es zwei Probleme:

  1. $randstring ist nicht im Geltungsbereich, wenn Sie es echoen.
  2. Die Zeichen werden in der Schleife nicht aneinandergereiht.

Hier ist ein Codeschnipsel mit den Korrekturen:

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

Geben Sie die Zufallszeichenfolge mit dem folgenden Aufruf aus:

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

Bitte beachten Sie, dass dadurch vorhersehbare Zufallszeichenfolgen erzeugt werden. Wenn Sie sichere Token erstellen möchten, siehe diese Antwort .

432voto

A. Cheshirov Punkte 4636

Anmerkung: str_shuffle() verwendet intern rand() die für kryptografische Zwecke (z. B. zur Erzeugung zufälliger Passwörter) ungeeignet ist. Sie wollen eine sicherer Zufallszahlengenerator stattdessen. Außerdem ist es nicht möglich, Zeichen zu wiederholen.

Eine weitere Möglichkeit.

AKTUALISIERT (dies erzeugt nun eine beliebige Länge der Zeichenkette):

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

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

Das war's. :)

427voto

Scott Arciszewski Punkte 32074

Es gibt viele Antworten auf diese Frage, aber keine von ihnen bringt eine Kryptographisch sicherer Pseudo-Zufallszahlengenerator (CSPRNG).

Die einfache, sichere und richtige Antwort ist die Verwendung von RandomLib und erfinden Sie das Rad nicht neu.

Für diejenigen unter Ihnen, die darauf bestehen, ihre eigene Lösung zu entwickeln, bietet PHP 7.0.0 random_int() für diesen Zweck; wenn Sie noch PHP 5.x verwenden, haben wir ein PHP 5 Polyfill für random_int() damit Sie die neue API schon vor dem Upgrade auf PHP 7 nutzen können.

Sichere Erzeugung zufälliger Ganzzahlen in PHP ist keine triviale Aufgabe. Sie sollten sich immer mit Ihre StackExchange-Experten für Kryptographie bevor Sie einen selbstentwickelten Algorithmus in der Produktion einsetzen.

Mit einem sicheren Integer-Generator ist die Erzeugung einer Zufallszeichenfolge mit einem CSPRNG ein Kinderspiel.

Erstellen einer sicheren, zufälligen Zeichenfolge

/**
 * Generate a random string, using a cryptographically secure 
 * pseudorandom number generator (random_int)
 *
 * This function uses type hints now (PHP 7+ only), but it was originally
 * written for PHP 5 as well.
 * 
 * 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(
    int $length = 64,
    string $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
): string {
    if ($length < 1) {
        throw new \RangeException("Length must be a positive integer");
    }
    $pieces = [];
    $max = mb_strlen($keyspace, '8bit') - 1;
    for ($i = 0; $i < $length; ++$i) {
        $pieces []= $keyspace[random_int(0, $max)];
    }
    return implode('', $pieces);
}

Verwendung :

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

Demo : https://3v4l.org/IMJGF (Ignorieren Sie die PHP 5-Fehler; es braucht random_compat)

213voto

Rudie Punkte 49458

Dies erzeugt eine 20 Zeichen lange hexadezimale Zeichenfolge:

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

In PHP 7 ( random_bytes() ):

$string = base64_encode(random_bytes(10)); // ~14 characters, includes /=+
// or
$string = substr(str_replace(['+', '/', '='], '', base64_encode(random_bytes(32))), 0, 32); // 32 characters, without /=+
// or
$string = bin2hex(random_bytes(10)); // 20 characters, only 0-9a-f

113voto

Humphrey Punkte 2463

@tasmaniski: Ihre Antwort hat bei mir funktioniert. Ich hatte das gleiche Problem, und ich würde es für diejenigen vorschlagen, die jemals auf der Suche nach der gleichen Antwort sind. Hier ist sie von @tasmaniski:

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

Hier ist ein youtube-Video, das uns zeigt, wie man eine Zufallszahl erstellt

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X