2012-05-02 15 views
7

मुझे इस प्रश्न का सीधा जवाब नहीं मिल रहा है। क्या कोई तरीका है जिसमें मैं लॉग इन करने के लिए लॉग इन उपयोगकर्ता को मजबूर कर सकता हूं? मेरा लॉगिन सिस्टम अनिवार्य रूप से केवल उस सत्र पर निर्भर करता है जिसमें उपयोगकर्ता की अद्वितीय आईडी होती है (जिसे एक mysql डेटाबेस में संग्रहीत किया जाता है)। तो अनिवार्य रूप से बस ...उपयोगकर्ता को लॉगआउट सत्र के लिए मजबूर करें PHP

if (isset($_SESSION['user_id'])) { 
echo "You're logged in!"; 
} else { 
echo "You need to login!"; 
} 

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

+0

क्यों नहीं जांचें कि उपयोगकर्ता को लॉगिन प्रक्रिया के दौरान प्रतिबंधित किया गया है ..? –

+0

मैं लॉगिन प्रक्रिया के दौरान जांच करता हूं, लेकिन अगर वे लॉगआउट नहीं करते हैं तो वे प्रतिबंधित होने के बावजूद साइट का उपयोग जारी रख सकते हैं ... मैं स्पष्ट रूप से उन्हें किसी कारण से प्रतिबंधित कर रहा हूं, मैं बस तब तक इंतजार नहीं करना चाहता जब तक वे खुद को लॉग आउट करने के लिए काफी दयालु है। – Ian

+0

इयान, क्या आपको समाधान मिला है? – Rossitten

उत्तर

6

या तो आप हर बार वे एक पृष्ठ लोड की जांच करने, या संभवतः सेट अंतराल पर एक अजाक्स कॉल पर देखने के डीबी से उनकी स्थिति की जांच करने की जरूरत है।

फिर आप अपने सत्र को समाप्त करने के लिए session_destroy(); का उपयोग कर सकते हैं। यह उनके पूरे सत्र को नष्ट कर देगा।

नहीं तो आप unset($_SESSION['user_id']); का उपयोग चर

+1

हम्म, अजैक्स एक दिलचस्प विचार है लेकिन एक कुशल उपयोगकर्ता कॉल को अवरुद्ध करने में सक्षम होगा। – Ian

0

आप इसे अनसेट कर सकते हैं।

unset($_SESSION['user_id']) 
+2

मुझे लगता है कि आप मेरे प्रश्न को गलत तरीके से पढ़ते हैं, मुझे पता है कि सत्रों को कैसे सेट करना है, मुझे नहीं पता कि कैसे करना है, उपयोगकर्ता को हर बार डेटाबेस का संदर्भ दिए बिना, अपने सत्र को अनसेट करने के लिए मजबूर करना पड़ता है। – Ian

+0

मुझे लगता है कि आप जानना चाहते हैं कि क्या आप मनमाने ढंग से सत्र को अनसेट कर सकते हैं। जवाब न है। PHP स्क्रिप्ट जो उन्हें एक पृष्ठ परोसती है, यह देखने के लिए क्वेरी करने की आवश्यकता है कि उन्हें प्रतिबंधित किया गया है या नहीं। जब भी पेज इसे प्रस्तुत करता है, तो आपको डीबी को उनकी मूल उपयोगकर्ता जानकारी के लिए पूछताछ करनी चाहिए, वैसे भी, अगर वे इसे किसी भी तरह बदलते हैं, तो बस जांचें कि क्या उन्हें प्रतिबंधित किया गया है और यदि ऐसा है तो सेट करें। – DanRedux

+0

हम्म, तो मुझे पेज प्रस्तुत करने पर हर बार सत्र चर को रीसेट करना चाहिए? यदि वे उन्हें बदलते हैं तो वे आवश्यक सत्र चर को रीसेट करते हैं (कहते हैं कि वे अपना उपयोगकर्ता नाम बदलते हैं, जो एक सत्र चर में संग्रहीत है), क्या कोई विशिष्ट सुरक्षा (या अन्य) कारण है कि मुझे पृष्ठ लोड होने पर हर बार जांच करनी चाहिए के बारे में जानना? – Ian

0

एक ही सत्र आप Custom Session Handlers इस तरह से आप पूर्ण नियंत्रण कहाँ और कैसे सत्र डेटा सर्वर पर संग्रहीत है इस्तेमाल कर सकते हैं अनसेट कर सकते हैं।

तो आप उदाहरण के लिए <user_id>.session नामक फ़ाइल में किसी विशेष उपयोगकर्ता के लिए सत्र डेटा संग्रहीत कर सकते हैं। फिर, उपयोगकर्ता को लॉगआउट करने के लिए, बस उस फ़ाइल को हटा दें।

+0

हू, अच्छी तरह से यह जानना अच्छा है। दुर्भाग्यवश मेरे लोकहोस्ट प्रोग्राम (एमएएमपी) ने PHP 5.4 के लिए समर्थन लॉन्च नहीं किया है, इसलिए मुझे लगता है कि जब तक ऐसा नहीं होता तब तक मैं इस समाधान को देखने के लिए जा रहा हूं। धन्यवाद। – Ian

+0

यह समाधान सत्र के जीवन के हर चक्र के दौरान PHP को निष्पादित करके प्रत्येक पृष्ठ को धीमा कर देता है जिसे आमतौर पर पूर्व-संकलित कोड द्वारा संभाला जाएगा। – DanRedux

+2

@Ian: यह PHP4 के साथ भी काम करता है (देखें: [session_set_save_handler] (http://www.php.net/manual/en/function.session-set-save-handler.php)) केवल नया [सत्रहैंडलर इंटरफेस] (http://www.php.net/manual/en/class.sessionhandlerinterface.php) PHP> = 5.4.0 की आवश्यकता है जो एक ही काम करने का एक और तरीका है। – stewe

5

पसंदीदा रूप से बिना किसी पृष्ठ को देखे बिना वे एक पृष्ठ देखते हैं कि उनकी स्थिति "प्रतिबंधित" पर स्विच की गई है या नहीं, क्योंकि यह मेरे सर्वर पर अनावश्यक तनाव की तरह लगता है।

सत्र में उपयोगकर्ता की एक प्रति संग्रहीत करने के बजाय उपयोगकर्ता को प्रत्येक पृष्ठ लोड पर डेटाबेस से लोड करना, एक बिल्कुल उचित समाधान है। यह उपयोगकर्ता को डेटाबेस में प्रतिलिपि से सिंक होने से रोकता है (उदाहरण के लिए, उदाहरण के लिए, आप उपयोगकर्ता के गुणों या अनुमतियों को बिना लॉग आउट और बैक इन किए बिना बदल सकते हैं)।

+0

+1। "मेरे सर्वर पर अनावश्यक तनाव की तरह लगता है।" = समयपूर्व अनुकूलन। –

0

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

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

0

कोशिश हर पृष्ठ पर इस डाल करने के लिए ...

if (isset($_SESSION['user_id'])) { 

    $sql = "SELECT from tbl where status='banned' and user_id=$_SESSION['user_id'] "; 
    $query = mysql_query($sql); 

    if(!empty(mysql_num_rows($query))){ // found the banned user 
     //redirect to logout or 
     //session_destroy(); 
    } 

} else { 
echo "You need to login!"; 
} 

उपयोगकर्ता अभी भी प्रवेश किया गया हो में ... जाँच करता है, तो उसका/उसकी स्थिति या प्रतिबंधित नहीं है ... अगर प्रतिबंध लगा दिया .. तो लॉगआउट

-1

सुरक्षा के आधार पर मेरी राय में यह करने के कुछ तरीके हैं: नोट: यह वास्तव में सही है ....मुझे पता है कि वाक्यविन्यास गलत है, यह सिर्फ आपके लिए एक विचार प्राप्त करने के लिए है।

$con = mysql_connect("localhost","sampleuser","samplepass"); 
if (!$con) 
{ 
$error = "Could not connect to server"; 
} 
mysql_select_db("sampledb", $con); 
$result = mysql_query("SELECT * FROM `sampletable` WHERE `username`='".$_SESSION['user_id']."'"); 
$userdeets = mysql_fetch_array($result); 
if($_SESSION['sessionvalue'] != $userdeets['sessionvalue']) 
{ 
session_destroy(); 
Header('Location: logout.php'); 
} 
else 
{ 
$result2 = mysql_query("UPDATE `sessionvalue` WHERE `username`='".$_SESSION['user_id']."' SET `sessionvalue` = RANDOMVALUE''"); 
$sesval = mysql_fetch_array($result2); 
$_SESSION['sessionvalue'] = $seshval 
} 

अब मैं thats नहीं बहुत कोड जानते हैं, लेकिन सार आप सुरक्षा के लिए करते हैं और इस क्षमता की आवश्यकता क्या है:

  • हर एक पृष्ठ लोड एक सत्र मान की जाँच में एक मान से मेल खाता डीबी
  • प्रत्येक बार एक पृष्ठ लोड एक यादृच्छिक जेनरेट डीबी मान के आधार पर एक नया सत्र मान सेट करता है। आपको उपयोगकर्ता नाम को सत्र में भी स्टोर करने की आवश्यकता होगी।
  • यदि सत्र आईडी मेल नहीं खाता है तो आप सत्र को नष्ट कर देते हैं और उन्हें पुनर्निर्देशित करते हैं।
  • यदि यह मेल खाता है तो आप नया सत्र आईडी बनाते हैं।

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

0

यह मेरे लिए काम किया है पीएचपी 5.4 का उपयोग कर 'connect.php' शामिल है;

session_start(); 
    if(session_destroy()) 
    { 
    header("Location: login.php"); 
    } 
0

आप पथ जहाँ पीएचपी सत्र फ़ाइलों की बचत होती है खोजने के लिए session_save_path() उपयोग कर सकते हैं, और फिर unlink() का उपयोग कर उन्हें हटा दें।

एक बार जब आप सेवर में संग्रहीत सत्र फ़ाइल को हटा देते हैं, तो ग्राहक पक्ष PHPSESSID कुकी प्रमाणीकरण के लिए मान्य नहीं होगा और उपयोगकर्ता स्वचालित रूप से आपके एप्लिकेशन से लॉग आउट हो जाएगा।

यदि इस प्रश्न का उपयोग वैश्विक/टीएमपी निर्देशिका के रूप में सामने आता है, तो कृपया इस दृष्टिकोण का उपयोग करते समय बहुत सावधान रहें! PHP के अलावा अस्थायी डेटा संग्रहीत करने के अलावा अन्य प्रक्रियाएं होने के बाध्य हैं। यदि पीएचपी की अपनी निर्देशिका निर्देशिका सत्र के लिए अलग है, तो यह काफी सुरक्षित होना चाहिए।

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