Token Süreci Güvenli

1 Cevap php

PHP ve MySQL kullanarak bir web sitesi geliştirme sis şu anda duyuyorum. Bu nedenle kayıtları e-postaları kullanarak izin gerekir özel bir web sitesidir. Yeni bir kullanıcı kayıtlı olması varsa basit açısından, yönetici sisteme gitmek ve kayıtlı bir e-posta adresi eklemek için vardır.

Ne yapmak istiyor bu oluyor zaman bir simge veya bir geçiş değer yaratmaktır.

İşte adımlar şunlardır:

  1. Yönetici sisteme bir e-posta ekler
  2. Benzersiz bir belirteci (örneğin, 1234567890) oluşturulur
  3. Belirteç değeri daha sonra kullanıcıların e-posta gönderilir
  4. kullanıcı sağlanan linke gider ve onun e-posta ve belirteci değerini girer
  5. Kullanıcı kayıt izin verilir - Başarı ise
  6. Fail eğer! - Token rejenere ve bu e-posta adresine tekrar göndermek

Ne gerçekten bilmek istiyorum bir simge oluşturmak için en iyi uygulama ne olacağını ve nasıl bir benzersiz bir belirteç bir e-posta kayıtlı her zaman oluşturmak için sağlayabilirsiniz.

Daha fazla güvenlik için ben her simge, sadece birkaç saat canlı olmasını sağlayabilirsiniz. Ama bu sisteme yetkisiz erişimi engellemek, ya da bu benim web güvenliği için kötü bir fikir olurdu?

Kullanım sonuçları (MD5 ile Sorunları) tahmin veya şifresi edilemez böylece SALT kullanmak karma algoritmalar: eşsiz bir simge oluşturma Düşüncelerim

Doğru yönde herhangi bir yardım ya da bir kurşun greatfull olacaktır.

1 Cevap

Ben PHP için bir kriptografik olarak güvenli sözde rasgele sayı üreteci veya (CSPRNG) üreten bu yöntemi seviyorum. It was written by Scott:

<?php
   function crypto_rand_secure($min, $max) {
        $range = $max - $min;
        if ($range < 0) return $min; // not so random...
        $log = 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=32){
    $token = "";
    $codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
    $codeAlphabet.= "0123456789";
    for($i=0;$i<$length;$i++){
        $token .= $codeAlphabet[crypto_rand_secure(0,strlen($codeAlphabet))];
    }
    return $token;
}
?>

Bir zaman aşımı ekleme açısından, ben veritabanında bu bakımı tavsiye. Registration_timeout gibi adlandırılan bir sütun ekleyin ve sonra ancak uzun zaman aşımı olmak istiyorum şimdiki zaman damgası + bu colmn ayarlamak için mysql'in AddTime () işlevini kullanın.

Ayrıca bu yüzden bir şey demek değildir bir e-posta hesabı kaydettirmek için birisi soran, geçici e-posta hesapları (... http://www.mailinator.com, http://www.guerrillamail.com, vb) kullanmak için önemsiz olduğunu akılda tutmak. Dahası, bir kullanıcı hesabı http://www.bugmenot.com bitebileceğini.