SORU
4 Aralık 2009, Cuma


Rasgele, benzersiz, alfasayısal bir dize oluşturmak için Nasıl?PHP:

Nasıl rastgele, benzersiz bir dize sayıları kullanarak ve doğrulamak bağlantı kullanmak için mektup oluşturmak mümkün mü? Bir web sitesinde bir hesap oluşturmak ve bir bağlantı içeren bir e-posta gönderir, ve hesabınızı doğrulamak için bu bağlantıyı tıklamanız gerekiyor...Evet...onlardan biri gibi.

Nasıl bu PHP kullanarak bir tane oluşturabilirsiniz?

Güncelleme:Sadece hatırladı uniqid(). Benzersiz bir tanımlayıcı mikrosaniye, mevcut saate göre oluşturur PHP bir işlevi var. Bunu kullanacağım sanırım.

CEVAP
5 Aralık 2012, ÇARŞAMBA


Sadece aynı bu sorunu çözmek için nasıl içine bakıyordu, ama ben de benim görevim şifre alma için kullanılabilir bir belirteç olarak oluşturmak istiyor. Bu tahmin edilecek bir belirteç yeteneğini sınırlamak istiyorum anlamına gelir. uniqid zamana dayalı olduğu için, ve php.net göre "dönüş değeri microtime biraz farklıdır()", uniqid kriterlere uymayan. PHP openssl_random_pseudo_bytes() şifreli olarak güvenli belirteçleri oluşturmak için yerine kullanarak önerir.

Hızlı ve kısa bir cevap

bin2hex(openssl_random_pseudo_bytes($bits))

uzunlukta alfanümerik karakterden oluşan rasgele bir dize üretir = $bits * 2. Ne yazık ki bu sadece [a-f][0-9] bir alfabesi vardır ama işe yarıyor.


Aşağıda kriterleri (Bu Erik'in cevap uygulanan bir versiyonudur) karşılayan yapabilirim en güçlü fonksiyonu.

function crypto_rand_secure($min, $max)
{
    $range = $max - $min;
    if ($range < 1) return $min; // not so random...
    $log = ceil(log($range, 2));
    $bytes = (int) ($log / 8)   1; // length in bytes
    $bits = (int) $log   1; // length in bits
    $filter = (int) (1 << $bits) - 1; // set all lower bits to 1
    do {
        $rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
        $rnd = $rnd & $filter; // discard irrelevant bits
    } while ($rnd >= $range);
    return $min   $rnd;
}

function getToken($length)
{
    $token = "";
    $codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
    $codeAlphabet.= "0123456789";
    $max = strlen($codeAlphabet) - 1;
    for ($i=0; $i < $length; $i  ) {
        $token .= $codeAlphabet[crypto_rand_secure(0, $max)];
    }
    return $token;
}

crypto_rand_secure($min, $max) rand() mt_rand için yedek bir düşüş olarak çalışıyor. Openssl_random_pseudo_bytes $min, $max arasında rastgele bir sayı oluşturmak için kullanır.

getToken($length) token içinde kullanmak için bir alfabe oluşturur ve o uzunlukta bir dize $length oluşturur.

DÜZENLEME:Kaynak http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php#104322 alıntı için ihmal ettim

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bethliebert

    bethliebert

    23 EKİM 2008
  • NYLON Video

    NYLON Video

    11 Aralık 2006
  • TSE

    TSE

    12 Kasım 2012