2011-02-23 16 views
5

मैं ऐसी प्रक्रिया जानना चाहता हूं जो आमतौर पर वेब ऐप्स एकाधिक अनुरोधों के बीच लॉगिन बनाए रखने के लिए अनुसरण करता है और यह भी कि कुकीज का उपयोग करके चीजों का प्रबंधन कैसे करता है।लॉगिन सिस्टम अवधारणा और तर्क?

मेरे लॉगिन फॉर्म में मैं "मुझे याद रखें" सुविधा प्रदान कर रहा हूं।

जब उपयोगकर्ता लॉगिन करते हैं तो मैं डेटाबेस से उपयोगकर्ता नाम और पासवर्ड वैधता की जांच करता हूं। यदि यह मान्य है तो मैं जांचता हूं कि "मुझे याद रखें" चुना गया है, यदि हां, तो सत्र में उपयोगकर्ता नाम और पासवर्ड संग्रहीत करना, एन्क्रिप्टेड प्रारूप। और अंत में सत्र में उपयोगकर्ता नाम और पासवर्ड संग्रहीत।

जब उपयोगकर्ता एक पृष्ठ को दूसरे पृष्ठ पर नेविगेट करता है, तो पहले मैं लॉगिन चेक स्क्रिप्ट चलाता हूं जो चेक करता है कि कुकीज में कोई मूल्य है या नहीं, तो यह वैधता की जांच करने के लिए डेटाबेस से उस उपयोगकर्ता नाम और पासवर्ड को मान्य करता है। यदि कुकी में कोई मूल्य नहीं है और सत्र में कुछ मूल्य है, तो मैं सत्र मूल्य को डीबी से जांचने के लिए एक डीएनओटी ला रहा हूं।

मैं डीबी को अनावश्यक रूप से हिट करने के लिए सत्र मूल्य फॉर्म डीबी की जांच नहीं कर रहा हूं, चीजों को तेज करता हूं। कुकीज़ के मामले में, उन्हें संशोधित किया जा सकता है, इसलिए जांच की आवश्यकता है।

यह मेरी अवधारणा है, क्या यह सही है? क्या यह जाने का तरीका है और आम तौर पर वेबसाइट स्लाईक एसओ, और इस तरह की विधि पर अन्य काम करता है?

या वेबसाइट प्रत्येक पृष्ठ लोड पर लॉगिन प्रामाणिकता की जांच करते हैं, सत्र में या कुकीज़ में कोई फर्क नहीं पड़ता?

कृपया इस परिदृश्य के लिए अपने विचार और अवधारणाओं की जांच करें और उन्हें दें।

धन्यवाद!

+0

संभवतः उपयोगी: [PHP के साथ उपयोगकर्ता सदस्यता] (http://net.tutsplus.com/tutorials/php/user-membership-with-php/) – drudge

+0

@ प्रशांत: कृपया मुझे [email protected] पर मेल करें, निजी में चर्चा करने की जरूरत है। इसे पढ़ने के बाद भी इसे हटा दें। –

उत्तर

13

सबसे पहले, अगर कोई लॉग इन है तो बस ट्रैक करें। उसके बाद, हम "मुझे याद रखें" सुविधा का ख्याल रखेंगे।

यह जानने के लिए कि कोई लॉग इन है या नहीं, तो आप बस $_SESSION सरणी देखें। वहां जो कुछ भी है वह है क्योंकि आप इसे पहले वहां रखते हैं। इसलिए, लॉगिन फॉर्म को संसाधित करते समय, यदि उपयोगकर्ता नाम & पासवर्ड सही है, तो आप उपयोगकर्ता नाम, उपयोगकर्ता आईडी या सत्र में जो कुछ भी संग्रहीत करते हैं ($_SESSION['username'] = $username;)।

जब भी उपयोगकर्ता किसी भी पृष्ठ को लोड करता, तो आप सिर्फ जाँच

if (isset($_SESSION['username'])) { 
    // $_SESSION['username'] is logged in 
} else { 
    // nobody is logged in 
} 

($_SESSION में पासवर्ड स्टोर करने के लिए वास्तव में, सुरक्षा उद्देश्यों के लिए, यह बेहतर है इसे कहीं भी दुकान नहीं करने के अलावा में टुकड़ों में बांटा कोई ज़रूरत नहीं है डेटाबेस)।

अब, "मुझे याद रखें" सुविधा ... सबसे पहले, कुछ विचार:

  • तो आप यह सुनिश्चित करें कि कुकी आवेदन करने के लिए भेजा नहीं किया गया है करने की आवश्यकता है कोई भी उपयोगकर्ता, अपने ब्राउज़र की कुकी संशोधित कर सकते हैं साथ छेड़छाड़।
  • उपयोगकर्ता इसे सार्वजनिक कंप्यूटर (पुस्तकालयों या अन्य) पर देख सकते हैं, इसलिए आपको इसे अमान्य करने के लिए एक सिस्टम की आवश्यकता है।
  • यदि कोई उपयोगकर्ता आपके एप्लिकेशन से लॉग आउट करता है, तो उसे याद रखने वाली कुकी को मिटा दिया जाना चाहिए।

पहला बिंदु के लिए, कल्पना है कि कुकी आप के लिए "याद" जा उपयोगकर्ता (बहुत असुरक्षित !!) के उपयोगकर्ता नाम की दुकान पर। इसका अर्थ यह है कि यदि कोई उपयोगकर्ता सामग्री के लिए वेब एप्लिकेशन के लिए कुकी बनाता है, तो आपके ऐप को लगता है कि उस कंप्यूटर में उपयोगकर्ता जो याद किया जाता है, इसलिए इस हमलावर तक पहुंच प्रदान करें जैसे कि वह जो था।तो, हमें कुकी को कुछ तरीके से क्रिप्ट/हैश करना होगा।

दूसरे बिंदु पर, कुछ कंप्यूटरों पर "मुझे याद रखें" को अमान्य कर, हम किसी भी तरह से पासवर्ड का उपयोग करेंगे। यदि कुछ उपयोगकर्ता उन सभी कंप्यूटरों को अमान्य करना चाहते हैं जहां उन्होंने "मुझे याद रखें" चेकबॉक्स की जांच की हो, तो उसे बस अपना पासवर्ड बदलना होगा। इसका मतलब यह भी है कि यदि वह अपना पासवर्ड बदलता है, तो उसी सटीक कारण के लिए, उसके खाते के लिए सभी सहेजे गए लॉग इन अमान्य हो जाएंगे। लेकिन माफ की तुलना में बेहतर सुरक्षित ...

तो, जब आप लॉगिन करते हैं और उपयोगकर्ता नाम और पासवर्ड सही होता है, और सत्र में उपयोगकर्ता नाम सहेजने के अलावा, "मुझे याद रखें" विकल्प चेक किया जाता है, तो आप एक स्टोर करते हैं उपयोगकर्ता द्वारा भेजी गई कुकी में उपयोगकर्ता नाम & पासवर्ड (और कुछ नमक यदि आप करेंगे) का हैश। कुकीज के माध्यम से कुकी में "लॉग इन" करने का प्रयास करने के लिए कौन सा उपयोगकर्ता कुकीज में "लॉग इन" करने का प्रयास कर रहा है, और कुकी के उपयोगकर्ता को हैश के साथ कुकी में उपयोगकर्ता नाम & पासवर्ड की जांच करने के लिए सादे पाठ (या एक उलटा तरीके से क्रिप्ट) में उपयोगकर्ता को स्टोर करने की आवश्यकता है। उपयोगकर्ता नाम & डेटाबेस में पासवर्ड। यदि वह चेक सही है, तो आप उपयोगकर्ता नाम को सत्र में संग्रहीत करते हैं और अब इस उपयोगकर्ता की कुकी (कम से कम इस सत्र के लिए) की जांच न करें।

तो, संपूर्ण रूप से अपने कोड इस प्रकार दिखाई देंगे:

login.php

if (check_login($_POST['username'], $_POST['password'])) { 
    // login correct 
    $_SESSION['username'] = $_POST['username']; 
    if (isset($_POST['remember_me'])) { 
     // we hash the password because we **NEVER** store it in plain text anywhere 
     // so when we would like to check if the cookie value is correct, we will not 
     // be able to do so if the hash in the cookie was done from the plaintext 
     // password. 
     $value = sprintf('%s:%s', $_POST['username'], md5($_POST['username'].hash_password($_POST['password']))); 
     setcookie('rememberme', $value); 
    } 
    redirect('/your/home/page.php'); // view Post/Redirect/Get design pattern 
} else { 
    // login incorrect, show error message and whatever... 
} 

हर php फ़ाइल की शुरुआत में (या बेहतर, एक शामिल फ़ाइल में अपने अनुप्रयोग bootstrap करने के लिए)

if (isset($_SESSION['username'])) { 
    // $_SESSION['username'] is logged in, proceed as you wish 
} else if (isset($_COOKIE['rememberme'])) { 
    // this user has checked the remember me feature some time ago in a previous login. 
    // let's check if it is valid. 
    list($username, $hash) = explode(':', $_COOKIE['rememberme']); 

    // we need to get the password hash stored for this user (remember you **NEVER** store passwords in plain text 
    $pwd_hash = obtain_password_hash_from_username($username); 
    if ($hash == sprintf('%s:%s', $username, md5($username.$pwd_hash))) { 
     // yeah, the user remembered is correct. We'll save it to the session to not do this shit again 
     $_SESSION['username'] = $username; 
    } else { 
     // the cookie value is not correct so maybe an attacker is trying to fool us, 
     // or the user changed his password. Whatever it is, we remove the cookie 
     // because it's no longer valid 
     setcookie('rememberme', '', time() - 3600); 
    } 

} else { 
    // this user is neither logged in nor "remembered" 
} 

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

मुझे लगता है कि यह सब कुछ है।

+0

यह बिल्कुल सही है। लेकिन सत्र अपहरण या कुछ ऐसा ही जो सत्र समझौता कर सकता है? और क्या वास्तव में सत्रों को इतनी आसानी से समझौता किया जा सकता है? – Prashant

+0

किसी हमलावर को अपहरण करने वाले सत्र के लिए सत्र कुकी तक पहुंच की आवश्यकता होती है। यह संभव है यदि हमलावर क्लाइंट और सर्वर (मैन-इन-द-बीच) के बीच नेटवर्क रूट में या उसी गैर-स्विच नेटवर्क में क्लाइंट या उसी खुले वाईफाई नेटवर्क में कहीं भी हो। इस मामले में हमलावर यातायात को छू सकता है, वैध उपयोगकर्ता की सत्र कुकी पढ़ सकता है और अपने सत्र को हाइजैक कर सकता है। इसके खिलाफ केवल रक्षा अंत-टू-एंड एन्क्रिप्शन (एसएसएल) है। –

+1

एक वैध उपयोगकर्ता की सत्र कुकी प्राप्त करने के लिए हमलावर के अन्य तरीकों, एक एक्सएसएस हमले के माध्यम से है। इस तरह के हमले से बचने के लिए, आपको अपने आउटपुट से एचटीएमएल पेज (एसक्यूएल इंजेक्शन से बचने के लिए डेटाबेस से पूछने से पहले मूल्यों से बचने के समान मूल्यों से बचने के लिए) से बच जाना चाहिए। एक एक्सएसएस के माध्यम से एक हमलावर आपके आवेदन में कुछ जावास्क्रिप्ट इंजेक्ट कर सकता है, और यह जावास्क्रिप्ट किसी वैध उपयोगकर्ता की सत्र कुकी तक पहुंचने का प्रयास कर सकता है। अपनी कुकीज़ तक पहुंचने वाले किसी भी जावास्क्रिप्ट से बचने के लिए, 'set_ookly' ... ''set_set_cookie_params (...)' –