2012-10-19 13 views
9

पहले मैं अद्वितीय हैश के साथ अतिरिक्त कुकी "यादृच्छिक" बना रहा था, जिसे डेटाबेस में संग्रहीत किया गया था, जो उपयोगकर्ता आईडी में मैप किया गया था।देशी सत्रों का उपयोग करते समय PHP के तहत "मुझे याद रखें" बनाने का सबसे अच्छा तरीका क्या है?

यदि उपयोगकर्ता की ऐसी कुकी थी - वेबसाइट ने डेटाबेस में इसका मूल्य ढूंढने का प्रयास किया, और यदि यह पाया गया कि सत्र स्थापित हो रहा था।

बाद में, नई परियोजना विकसित करने के बाद मैंने सोचा कि शायद यह अनूठा हैश उत्पन्न करने के लिए बहुत सुरक्षित नहीं है, और एक ऑपरेशन (उपयोगकर्ता पहचान) के लिए दो कुकीज़ (मूल "PHPSESSID" + my "rememberme") रखना बहुत अधिक है ।

शायद वैश्विक सत्र जीवनकाल स्थापित करने का कोई तरीका नहीं है, लेकिन अलग-अलग उपयोगकर्ता सत्रों के लिए इसे अलग-अलग सेट अप करने के लिए ... या शायद उपयोगकर्ता सत्र में उपयोगकर्ता सत्र को रखना बेहतर है, उपयोगकर्ता आईडी में मैप किया गया है?

UPDATE 1 मैंने सोचा कि अगर यह करने के लिए "मुझे याद रखें" बटन है, हम एक और तरीका जा सकते हैं बहुत मुश्किल है - "नहीं मेरे कंप्यूटर बटन" बनाने के लिए। आइडिया php.ini (उदाहरण के लिए) में एक सप्ताह के लिए डिफ़ॉल्ट cookie_lifetime सेट करना है, और यदि उपयोगकर्ता इस चेकबॉक्स को चेक करता है - हम session_set_cookie_params फ़ंक्शन का उपयोग करके कुकी_लिफ़टाइम शून्य में सेट करेंगे।

तो, 1 सवाल यह है कि - होगा session_set_cookie_params अन्य उपयोगकर्ताओं कुकीज़ को प्रभावित (दस्तावेज में यह कहा जाता है, कि session_set_cookie_params विकल्प जब तक php प्रक्रिया को क्रियान्वित किया जाएगा असर नहीं होगा)

2 डी सवाल है कि session_set_cookie_params अगर वैश्विक प्रभावित कर रहा है सेटिंग्स, सत्र पुनर्जन्म उपयोगकर्ताओं को प्रभावित करेगा, जो एक लंबे जीवन कुकी रखना नहीं चाहते हैं?

अद्यतन 2: [प्रश्न 1 जवाब]

बस session_set_cookie_params समारोह का परीक्षण किया। मैं शून्य session_set_cookie_params का उपयोग करते हुए एक स्क्रिप्ट, कि सत्र कुकी जीवनकाल सेट लिखा था और उसके बाद 30 सेकंड के लिए क्रियान्वित:

if ($_GET['test']) { 
    session_set_cookie_params (0); 
    while (true) { 
    sleep(1); 
    } 
} 
session_start(); 

तो, पहले ब्राउज़र में मैं सिर्फ परीक्षण = 1 पैरामीटर, बस उस के बाद से इस स्क्रिप्ट शुरू कर दिया (जबकि यह स्क्रिप्ट निष्पादित हो रही थी) मैंने दूसरे स्क्रिप्ट में पैरामीटर के बिना इस स्क्रिप्ट को शुरू किया। जवाब नहीं है - दूसरा ब्राउज़र की कुकी प्रभावित नहीं हुई थी। यह जीवन भर था कि php.ini

अद्यतन 3 में निर्दिष्ट किया गया था,:, [प्रश्न 2 जवाब] फिर, मैं अगर उत्थान सत्र कुकी जीवन को प्रभावित करता है की जाँच करने के की कोशिश की है कि session_set_cookie_params द्वारा स्थापित किया गया था।

हां, यह प्रभावित करता है। अगर मैं अनुकूलित जीवन भर के साथ सत्र कुकी सेट, कि,) session_set_cookie_params द्वारा स्थापित किया गया था, और उसके बाद session_regenerate_id (फोन, कुकी जीवनकाल, php.ini

में सेट करना होगा लेकिन अगर हम सेट session_set_cookie_params (0) session_regenerate_id कॉल करने से पहले() , हमारी कुकी में सही जीवनकाल होगा।

तो, यह है! वह तो आसान था! 8)

धन्यवाद, महिलाओं और सज्जनो!

+0

मैं डॉन इसे प्राप्त नहीं करें। सत्र जीवनकाल इस तथ्य को प्रभावित नहीं करता है कि ब्राउजर को बहाल करने के बाद उपयोगकर्ता को एक नया PHPSESSID मिल जाएगा। कृपया अपनी सुरक्षा चिंताओं को विस्तृत करें। – Teson

+0

मैं उपयोगकर्ता की पहचान के लिए एक कुकी रखना चाहता हूं। मुझे यकीन नहीं है कि मेरी कस्टम कुकी "यादृच्छिक" सुरक्षित है, अधिक से अधिक, मैं इसके बारे में सोचना नहीं चाहता - एक ऑपरेशन के लिए दो कुकीज़ बहुत अनावश्यक है। – avasin

+0

एक सीधा तरीका एक या दो कुकीज़ का उपयोग मूल्य 'SHA1 ($ userid। $ Salt)' और सार्वजनिक 'उपयोगकर्ता नाम' के साथ करना है। – Stan

उत्तर

2

के रूप में चेकबॉक्स कार्यक्षमता "मुझे याद रखें" बनाना इतना कठिन था, मैं केवल एक कुकी का उपयोग करके, एक और तरीके से आया था।

तैयारी

1) मैं तीन जानकारी के साथ एक फार्म तैयार किया है:

  • "लॉगिन" इनपुट [प्रकार = पाठ]: उपयोगकर्ता का प्रवेश
  • "पासवर्ड" इनपुट [प्रकार = पासवर्ड]: उपयोगकर्ता का पासवर्ड
  • "मेरा कंप्यूटर नहीं" इनपुट [प्रकार = चेकबॉक्स]: जो हमें सत्र कुकी के साथ सत्र कुकी का उपयोग करने के लिए बताएगा (ब्राउज़र बंद होने पर कुकी हटा दी जानी चाहिए)

2) मैंने डिफ़ॉल्ट रूप से लंबी-जीवन कुकीज रखने के लिए session.cookie_lifetime = 100500 सेट किया है।

कुकी सेटअप

तो, उपयोगकर्ता प्रपत्र सबमिट करने के बाद, हम जांच - वह छोटे सत्र का उपयोग करने का चयन किया है, तो - हम फोन session_set_cookie_params (0) वास्तव में session_start उपयोग करने से पहले उसे सत्र कुकी (सेट करने से पहले ())।

कुकी पुनर्जनन

तब, जब हम सत्र कुकी को पुनर्जीवित करने की जरूरत है, हम भी यह आसानी से session_regenerate_id() फ़ंक्शन के साथ क्या कर सकते हैं। लेकिन हमें याद रखना होगा कि यह फ़ंक्शन डिफ़ॉल्ट रूप से php.ini से सत्र कुकी जीवनकाल को फिर से सेट करेगा। इसलिए, हमें कुकी को पुन: उत्पन्न करने से पहले session_set_cookie_params() को कॉल करने की भी आवश्यकता है। बीटीडब्ल्यू, आप कस्टम सत्र कुकी जीवनकाल $ _SESSION में स्टोर कर सकते हैं। यह इस तरह दिखेगा: इस उत्तर के लिए

// Form handling, session setup 
if ($_POST['not-my-computer']) { 
    session_set_cookie_params(0); 
    session_start(); 
    $_SESSION['expires'] = 0; 
} 

// Session regeneration 
if (isset($_SESSION['expires'])) { 
    session_set_cookie_params(0); 
    session_regenerate_id(); 
} 

विवरण (और अधिक गहरी स्पष्टीकरण) आप प्रश्न पाठ में पा सकते हैं (जब मैं परीक्षण किया गया था, मैं जोड़ा जवाब/परीक्षण वहाँ परिणाम)

2

आप इस सत्र आप निम्न कर सकते केवल का उपयोग कर ऐसा करने के लिए उपयोगकर्ता याद किया जाना चाहता है, तो चाहते हैं:

if((isset($_POST['remember_me']) && $_POST['remember_me']) || ($_COOKIE['remember_me']) && $_COOKIE['remember_me'])) { 

    // store these cookies in an other directory to make sure they don't 
    // get deleted by the garbage collector when starting a "non-remeber-me"-session 
    $remember_me_dir = ini_get('session.save_path') . DS . "remember_me_sessions"; 

    // create the directory if it doesn't exist 
    if (!is_dir($remember_me_dir)) { 
    mkdir($remember_me_dir); 
    } 

    // set the php.ini-directive (temporarily) 
    ini_set('session.save_path', $remember_me_dir); 

    // define lifetime of the cookie on client side 
    $expire_cookie = 60 * 60 * 24 * 30; // in seconds 
    session_set_cookie_params($expire_cookie); 

    // lifetime of the cookie on server side 
    // session file gets deleted after this timespan 
    // add a few seconds to make sure the browser deletes 
    // the cookie first. 
    $garbage_in = $expire_cookie + 600; // in seconds 

    // set the php-ini directive for the garbage collector of the session files. 
    ini_set('session.gc_maxlifetime', $garbage_in);  
    // send an additional cookie to keep track of the users 
    // which checked the 'remember_me' checkbox 
    setcookie('remember_me', 1, time() + $expire_cookie); 
} 

// now we are ready to start the session 
// For all the users which didn't choose to check the 'remember_me' box 
// the default settings in php.ini are used. 
session_start(); 

Here आप संबंधित php.ini सत्र के बारे में अधिक पढ़ सकते हैं -directives

+0

हम्म .. शायद एक सप्ताह के लिए सभी सत्र कुकीज़ सेट अप करने का एक तरीका हो सकता है उदाहरण के लिए चेकबॉक्स "मेरा कंप्यूटर नहीं" के साथ। यदि यह चेकबॉक्स चेक किया जाएगा, तो सत्र कुकी सेट करने से पहले हम सत्र कुकी जीवनकाल सत्र_set_cookie_params से शून्य पर सेट करेंगे? – avasin

+0

तो, सवाल यह है: "क्या session_set_cookie_params का वैश्विक प्रभाव है या वर्तमान स्क्रिप्ट निष्पादन को प्रभावित करता है?" और दूसरी समस्या हो सकती है .. एचएम .. सत्र पुनर्जन्म (जैसा कि मैं समझता हूं कि php इसे किसी भी तरह पुन: उत्पन्न करता है) – avasin

संबंधित मुद्दे

 संबंधित मुद्दे