2009-05-18 11 views
19

उपयोगकर्ता मेरी वेबसाइट पर ईमेल सदस्यता लेने के बाद। मेरी वेबसाइट एक ईमेल पुष्टि उत्पन्न करेगी और उन्हें भेजेंगी।php में एक सुरक्षित सक्रियण स्ट्रिंग कैसे उत्पन्न करें?

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

कैसे आप कुंजी उत्पन्न करते हैं: ईमेल सामग्री में, मैं सक्रियण कुंजी, जैसे कुछ शामिल करने की ज़रूरत? sha1 ($ ईमेल) का उपयोग कर ??

कुंजी उत्पन्न करने के बाद, मैं इसे डेटाबेस में संग्रहीत करता हूं, ताकि जब उपयोगकर्ता लिंक पर क्लिक करता है तो मैं इसे डेटाबेस के साथ सत्यापित कर सकता हूं ?? .. मैं यह करने के लिए नया हूँ, कृपया सलाह .. मैं एक ईमेल पुष्टि स्क्रिप्ट की जरूरत

उत्तर

24

व्यक्तिगत रूप से, सिर्फ मैं जैसी चीजों का एक संयोजन का उपयोग करें:

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

टक्कर की संभावना छोटा है, लेकिन मेरा सुझाव है इसे भेजने से पहले अपने डेटाबेस को पहले जांचना (अद्वितीय बाधाओं का उपयोग करना एक आसान तरीका है)।

+5

टकराव का कोई मौका नहीं है कि आप यूआरएल में उपयोगकर्ता आईडी भी जोड़ते हैं और जांचते हैं कि वे दोनों मेल खाते हैं। – Eli

+0

@ एली, एक मौका है, क्योंकि पात्रों के कुछ संग्रह एक ही हैश स्ट्रिंग के लिए हैश करते हैं। हालांकि मौका काफी नगण्य है (लेकिन अभी भी वहां)। – alex

+2

एह, मैं उपयोगकर्ता को प्राथमिक कुंजी जानकारी प्रकट करने का प्रशंसक नहीं हूं। लेकिन यह एक अच्छा विचार है, एली। तो कुंजी = $ जेनरेट की गई और आईडी = $ uid –

1
$guid=md5(uniqid(mt_rand(), true)); 
0

कि यह करना चाहिए, फिर भी आप इसे कुछ नमक, उदाहरण जोड़कर में सुधार कर सकते हैं:

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

अन्य दृष्टिकोण सिर्फ एक यादृच्छिक पासवर्ड पैदा करते हैं और ईमेल के माध्यम से भेजने के लिए है।

1

यदि आप डेटाबेस में सक्रियण स्ट्रिंग संग्रहीत कर रहे हैं और इसे बाद में जांच रहे हैं, तो आपको एक हैश की आवश्यकता नहीं है!

आपको बस एक लंबी, यादृच्छिक स्ट्रिंग की आवश्यकता है। आप इसे उत्पन्न कर सकते हैं हालांकि आप चाहते हैं, बस इसे लंबा बनाओ। वास्तव में, यह आदर्श रूप से ईमेल या उपयोगकर्ता नाम के साथ कुछ भी नहीं करना चाहिए।

+1

के लिए धन्यवाद यही कारण है कि sha1, md5, और अन्य क्रिप्ट फ़ंक्शन अच्छे हैं क्योंकि वे प्रतीत होता है कि वे यादृच्छिक तार बनाते हैं। यदि आप अनन्य (कम टक्कर) वाले तार चाहते हैं, तो आपकी सबसे अच्छी शर्त उन्हें कुछ अद्वितीय निरंतर (ईमेल) और कुछ अतिरिक्त नमकीन से दूर करना है। –

+2

हैश फ़ंक्शंस कोई एंट्रॉपी नहीं जोड़ता है, इसलिए वे इस मामले में टकराव नहीं करते हैं। वे सिर्फ मनुष्यों के लिए * अधिक यादृच्छिक * देखो। – Eli

7

आप मूल रूप से कुछ ही विकल्प हैं:

1) एक भी अद्वितीय पहचानकर्ता मालूम होता है यादृच्छिक है बनाएँ और अपने डेटाबेस में संग्रहीत जिसके साथ यह

2 से मेल खाती है उपयोगकर्ता नाम) एक यादृच्छिक पासवर्ड जनरेट करें और शामिल लिंक में उपयोगकर्ता आईडी और पासवर्ड डेटाबेस में पासवर्ड

3) उपयोगकर्ता पहचानकर्ता को एन्क्रिप्ट करने के लिए एक तरह से हैशिंग फ़ंक्शन (md5, sah1, आदि) और एक गुप्त पहचानकर्ता का उपयोग करें। आपको अपने डेटाबेस में एन्क्रिप्टेड उपयोगकर्ता पहचानकर्ता को स्टोर करने की आवश्यकता नहीं है।

विकल्प 1 कठिन है क्योंकि आपको यह देखने के लिए डेटाबेस की जांच करने की चिंता करनी है कि कुंजी पहले से मौजूद है या नहीं। हालांकि, यह अच्छा है कि यूआरएल में उपयोगकर्ता नाम सक्रिय नहीं है।

यदि आप भविष्य में उपयोगकर्ता जानकारी (शायद न्यूनतम पर एक पासवर्ड) स्टोर करने के लिए कुछ प्रकार के डेटाबेस का उपयोग करने जा रहे हैं, तो आप विकल्प 2 के साथ जा सकते हैं। इसमें एक और कॉलम जोड़ने के लिए बहुत कुछ नहीं लगता है आपका डेटाबेस ईमेल भेजते समय, उपयोगकर्ता नाम और पंक्ति के लिए किसी अन्य कॉलम में उपयोगकर्ता नाम और $ key = sha1 (रैंड (1, 99 999)। $ उपयोगकर्ता नाम) जैसे कुछ सहेजें। फिर आपका लिंक इस तरह दिखता है: http://you.com/activation.php?user= $ उपयोगकर्ता नाम & कुंजी = $ कुंजी। Activation.php में आप यह देखने के लिए जांचते हैं कि कुंजी डेटाबेस में संग्रहीत मान के बराबर है या नहीं।

यदि आप अपने डेटाबेस में कम संग्रहण स्थान का उपयोग करना चाहते हैं, तो विकल्प 3 काम करेगा। आप गुप्त पहचानकर्ता के रूप में $ key = sha1 ($ mysecret। $ उपयोगकर्ता नाम) जैसे कुछ का उपयोग कर सकते हैं। कुछ अजीब प्रयोग करें कि केवल आप $ mysecret जैसे 'aaafj_my_secret_adfaf' के रूप में जानते हैं। विकल्प 2 में उसी प्रकार के यूआरएल का प्रयोग करें।हालांकि, क्योंकि आप केवल $ उपयोगकर्ता नाम पर आधारित $ कुंजी उत्पन्न कर सकते हैं, आपको इसे स्टोर करने की आवश्यकता नहीं है। तो जब आप activation.php में प्रसंस्करण कर रहे हैं, तो यह देखने के लिए जांचें कि sha1 ($ mysecret। $ _GET [उपयोगकर्ता नाम]) == $ _GET [key]। यदि ऐसा होता है, तो आप जानते हैं कि आपके पास सही उपयोगकर्ता है। सैद्धांतिक रूप से, पर्याप्त पंजीकरण के साथ, कोई $ mysecret के लिए अपना मूल्य समझ सकता है और सक्रियण कुंजी भी उत्पन्न कर सकता है। हालांकि, आप निश्चित रूप से उन अरबों या अधिक पंजीकरणों को नोटिस करेंगे जो इससे पहले कि वे गणना कर सकें, इसकी गणना करना शुरू हो जाएगा। आवश्यक सक्रियण की संख्या हैशिंग फ़ंक्शन के मुख्य आकार पर आधारित है। Sha1 (160 बिट) बनाम md5 (128 बिट) का उपयोग करें ताकि आपके $ mysecret मान का अनुमान लगाना मुश्किल हो।

+1

विकल्पों और उनके पेशेवरों और विपक्ष का बहुत अच्छा सारांश! मैं केवल इतना जोड़ूंगा कि आप कौन सा विकल्प चुनते हैं, कुछ ऐसे "इनवेरिएंट" हैं जो उन सभी के लिए सच हैं। उदाहरण के लिए: 1. सक्रियण लिंक को पूरी तरह अद्वितीय होना चाहिए, क्योंकि यदि यह नहीं है, तो आप यह नहीं बता सकते कि कौन सा उपयोगकर्ता सक्रिय करना है। 2. आपको अपने डीबी में कम से कम ई-मेल पता स्टोर करना होगा, और यह भी अद्वितीय होना चाहिए। इस विचार में, पहले विकल्प का कंस इतना कॉन नहीं है, क्योंकि आप वैसे भी विशिष्टता की जांच कर लेंगे (कम से कम ई-मेल पते का)। – SasQ

0
$code = md5($_POST['username'] . microtime()); 
संबंधित मुद्दे