2011-06-15 17 views
5

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

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

+1

http://stackoverflow.com/questions/580534/best-way-to-limit-and-record-login-attempts http://stackoverflow.com/questions/679756/limiting-user-login-attempts- इन-पीएचपी – Jacob

उत्तर

8

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

हालांकि, मुझे संदेह है कि आपको डेटाबेस से उपयोगकर्ता नाम और पासवर्ड मिल रहा है, क्यों आप असफल लॉगिन की आखिरी संख्या भी नहीं लेते हैं?

if (isset($_POST['submit_login'])) { 

    if (isset($_POST['username']) && isset($_POST['password'])) { 
     $username = mysql_real_escape_string($_POST['username']); 
     $password = mysql_real_escape_string($_POST['password']); 
     // id = unique primary key 
     $rs = mysql_query('SELECT id,Username,Password,Failed_logins,IP_address FROM Users WHERE Username = '.$username.''); 
     $num = mysql_num_rows($rs); 
     if ($num > 0) { 
      // I would add a password hash here to $password, and check against the hashed Password from the database 
      // But let's check the clean passwords 
      $row = mysql_fetch_array($rs); 
      if ($password == $row['Password']) { 
       // Successful login, set session or whatever you need 
       // Reset failed logins 
       mysql_query('UPDATE Users SET Failed_logins = 0 WHERE id = '.$row['id'].''); 
       header('location: success.php'); 
      } else { 
       // Failed password check 
       if ($row['Failed_logins'] > 3) { 
        // Redirect to captcha 
        header('location: captcha.php'); 
       } else { 
        $ip = $_SERVER['REMOTE_ADDR']; 
        if ($row['IP_address'] != $ip) { 
         // New ip adress, reset failed logins 
         $failed_logins = 0; 
        } else { 
         // Increment failed logins 
         $failed_logins = $row['Failed_logins']+1; 
        } 
        mysql_query('UPDATE Users SET Failed_logins = '.$failed_logins.',IP_address = '.$ip.' WHERE id = '.$row['id'].' '); 
       } // End check Failed_logins > 3 
      } 
     } else { 
      // No such Username found in database 
      $error = 'no_such_username'; 
     } // End username check from database 

    } else { 
     // Either username or password is missing 
     $error = 'incomplete_form'; 
    } // end check for username and password 

} // end main submit_login check 

ऐसा कुछ।

संपादित करें:

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

+2

सफल लॉग इन पर 'विफल_logins' को रीसेट करना याद रखें। – jensgram

+0

हाँ अच्छा है। तो सफल लॉगिन के बाद ही fail_login रीसेट किया जाना चाहिए? तो अगर कोई व्यक्ति एक साल बाद प्रयास करता है, तो वह अनुमति नहीं देगा? क्या मुझे login_time जैसे एक और कॉलम जोड़ना चाहिए और उस समय की तुलना करना चाहिए? आइए कहें कि कोई व्यक्ति केवल 24 घंटों में 3 बार कोशिश कर सकता है? क्या यह अच्छा विचार है? – Roman

+0

क्या होगा यदि कोई हमलावर गैर-मौजूद उपयोगकर्ता नामों की आपूर्ति करता रहता है? – Roman

0

आपको डेटाबेस में प्रयासों को सहेजना चाहिए और उपयोगकर्ता को जांचना चाहिए।

1

आप क्या सुरक्षा कर रहे हैं?

यादृच्छिक उपयोगकर्ता-केवल सामग्री, उपयोगकर्ता नाम।

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

क्या आप यह पूछ रहे हैं कि इसे कैसे करें, या किसका उपयोग करना चाहिए?

1

आपको समय की आवश्यकता है, आप अन्यथा कैसे निर्धारित करेंगे कि लॉगिन प्रयास समाप्त हो गया है या नहीं? अगर मैं 10 साल के समय में 4 गुना लॉगिन करने में विफल रहता हूं तो मैं अवरुद्ध हो जाऊंगा। आप उन लोगों को अवरुद्ध करना चाहते हैं जो कम समय में कई लॉगिन प्रयासों का प्रयास करते हैं।

मेरा सुझाव है कि आप डेटाबेस का उपयोग करें - क्योंकि आप एक ही समय में लॉग इन का विस्तृत इतिहास रखेंगे। लेकिन memcached जैसे स्मृति आधारित समाधान भी पर्याप्त हो सकता है।

विस्तार करने के लिए कौन सी सुरक्षा लागू करने के लिए: एक संयोजन!

उपयोग किए गए उपयोगकर्ता नाम और आईपी पते को संयोजित करें और उन्हें अपने डेटाबेस में संग्रहीत करें।

  1. अपने उपयोगकर्ता नाम पर लॉगिन प्रयासों का उपयोग सीधे अपने उपयोगकर्ताओं को प्रयासों से बचाने के लिए करें।
  2. केवल एक पहचान का निरीक्षण करने के लिए आईपी पता जानकारी का उपयोग करें, और यदि आवश्यक हो तो कार्रवाई करें।
+0

विचार के लिए धन्यवाद। अब, क्या उपयोगकर्ता के उपयोगकर्ता नाम या आईपी पते को स्टोर करना अधिक उपयोगी होगा? क्या होता है यदि कोई हमलावर मौजूद उपयोगकर्ता नाम और पासवर्ड की आपूर्ति करता रहता है? – Roman

0

ऐसा करने का सबसे अच्छा तरीका डेटाबेस का उपयोग करना है।

(क) आईपी पते (जहां व्यक्ति में प्रवेश करने का प्रयास किया जाता है) (ख) लॉगिन प्रयास की संख्या (:

आप अपने डेटाबेस में एक अलग तालिका, जो तीन चर संग्रहीत करेंगे बनाने की जरूरत ग) तिथि/समय (या: वर्तमान टाइमस्टैम्प)

इस दृष्टिकोण के साथ समस्या सिर्फ पहले चर के साथ है: आईपी पते

क्या होगा यदि व्यक्ति एक इंटरनेट कैफे में है? या सार्वजनिक वाई-फाई का उपयोग कर रहे हैं? या हॉटस्पॉट? या, एक स्कूल? कार्यालय? आदि, आदि

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

आपकी वेबसाइट किसी बैंक, या सैन्य स्थापना, या पेंटागन जैसी कुछ चिंताओं से संबंधित नहीं है।

लेकिन, यदि आपकी वेबसाइट एक व्यवसाय है (खरीद और बिक्री, खेल, जो भी हो), तो एक विशिष्ट पते को अवरुद्ध करने से केवल आपके ग्राहकों को बंद कर दिया जाएगा!

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