Php güvenli bir aktivasyon dize oluşturmak için nasıl?

4 Cevap php

Kullanıcı sonra web siteme e-posta abone. Benim web sitesi bir onay e-postası oluşturmak ve onlara göndereceğiz. E-posta içeriğinde, ben aktivasyon anahtarı gibi bir şey eklemek gerekir:

www.domain.com/activate.php?key = $ generatedKey

Nasıl anahtarını oluşturmak mı? sha1 ($ email) kullanıyor?

Sonra anahtarı oluşturmak kullanıcı bağlantısını tıklayın zaman veritabanı ile doğrulanmış, böylece, i, veritabanında saklamak? Ben bunu yeni duyuyorum, ben bir e-posta Onay komut dosyası gerekir .. lütfen bildiriniz ..

4 Cevap

Şahsen, sadece ben gibi şeyler bir arada kullanın:

$generatedKey = sha1(mt_rand(10000,99999).time().$email);

Çarpışma şansı küçük, ama ben dışarı göndermeden önce ilk veritabanını atmanızı öneririz (UNIQUE kısıtlamaları kullanarak kolay bir yoludur).

Bu temelde bir kaç seçenek var:

1) rastgele tek bir benzersiz bir tanımlayıcı oluşturun ve karşılık hangi kullanıcı adı ile bu veritabanında saklayabilirsiniz

2) rastgele bir parola oluşturun ve bağlantı kullanıcı kimliği ve şifre ve veritabanı parolayı depolamak

3) kullanıcı kimliği şifrelemek için tek yönlü bir karma işlev (md5, sah1, vb) ve gizli bir tanımlayıcı kullanın. Eğer veritabanında şifreli bir kullanıcı kimliğini saklamak zorunda değilsiniz.

Eğer anahtar zaten varsa görmek için veritabanı denetimi konusunda endişelenmenize gerek çünkü Seçenek 1. zordur. Ancak, URL aktive ediliyor adını içermediğini güzel.

Zaten ileride kullanıcı bilgilerini (en az muhtemelen parola) depolamak için veritabanı çeşit kullanmak için gidiyoruz, sen seçeneği 2 ile gidebiliriz. Bu veritabanına başka bir sütun eklemek için bir şey almaz. E-posta gönderirken, kullanıcı adını içeren satır için başka bir sütuna $ key = sha1 (rand (1, 99999). $ Username) gibi kullanıcı adı ve bir şey kaydetmek. http://you.com/activation.php?user= $ username & key = $ tuşu: O zaman bağlantı bu gibi bakmak var. Activation.php size anahtar veritabanında saklanan değere eşit olup olmadığını görmek için kontrol edin.

Eğer veritabanında daha az depolama alanı kullanmak istiyorsanız, seçenek 3 çalışacaktır. Sen gizli tanımlayıcı olarak $ anahtar = sha1 ($ mysecret. $ Username) gibi bir şey kullanabilirsiniz. Sadece böyle 'aaafj_my_secret_adfaf' olarak $ mysecret olarak biliyorum ki garip bir şey kullanın. 2 seçeneği olarak URL aynı tip kullanın. Ancak, sadece $ username dayalı $ anahtar oluşturabilir çünkü, bunu saklamak gerekmez. Eğer activation.php olarak işlerken Yani, sadece görmek için kontrol eğer sha1 ($ mysecret. $ _GET [Kullanıcı adı]) == $ _GET [anahtar]. Öyle ise, size doğru kullanıcı olduğunu biliyorum. Teorik olarak, yeterli kayıtları ile, birisi $ mysecret için değerini anlamaya olabilir ve çok etkinleştirme anahtarları oluşturur. Ancak, elbette onlar ne olduğunu hesaplamak için başlayabilir önce alacağını tescillerinin milyarlarca veya daha fazla fark olurdu. Gerekli aktivasyon sayısı müzakere fonksiyonunun anahtar boyutuna dayanmaktadır. Zor senin $ mysecret değerini tahmin yapmak için md5 vs SHA1 (160 bit) (128 bit) kullanın.

Bu ancak bazı tuz, örnek ekleyerek artırabilirsiniz, bunu yapmak gerekir:

$key = sha1($email . 'doYouLikeSauce');

Diğer yaklaşım sadece rastgele bir parola oluşturmak ve e-posta yoluyla göndermek.

Eğer veritabanında aktivasyon dize depolamak ve daha sonra kontrol ediyorsanız, size hiç bir karma gerek yok!

Sadece uzun bir rasgele bir dize gerekir. İstediğiniz ancak sadece uzun yapmak, onu üretebilir. Aslında, bu ideal e-posta veya kullanıcı adı ile yapacağız hiç bir şey olmalıdır.