2009-01-19 12 views
11

मैं अपने जावा वेब एप्लिकेशन में लॉगिन प्रयासों को थ्रॉटल करने के लिए एक कुशल तंत्र को कार्यान्वित करना चाहता हूं, ताकि उपयोगकर्ता खातों पर ब्रूट-फोर्स हमलों को रोका जा सके। कि वास्तव में मुझे मदद नहीं करता है के साथ के रूप में मैं memcached और न ही Django का उपयोग नहीं कर सकते हैं:जावा वेबपैप में लॉगिन प्रयासों को कैसे थ्रॉटल करें?

Jeff explained the why, but not the how.

सिमोन विललिसन एक implementation in Python for Django दिखाया।

स्क्रैच से अपने विचारों को पोर्ट करना बहुत अच्छा प्रतीत नहीं होता है - मैं पहिया को फिर से शुरू नहीं करना चाहता हूं।

मुझे एक Java implementation मिला, हालांकि यह अपेक्षाकृत नाइव है: एलआरयू कैश के बजाय, यह केवल 15 मिनट के बाद सभी प्रविष्टियों को साफ़ करता है।

ईएचसीएच memcached के लिए एक विकल्प हो सकता है, लेकिन मुझे इसके साथ कोई अनुभव नहीं है और वास्तव में एक और तकनीक का निर्माण नहीं करना चाहते हैं यदि इस कार्य के लिए बेहतर विकल्प हैं।

तो, जावा में लॉगिन थ्रॉटलिंग को लागू करने का एक अच्छा तरीका क्या है?

उत्तर

1

मैंने पहलू सुरक्षा द्वारा चलाए गए वेब सुरक्षा पाठ्यक्रम को अभी पूरा कर लिया है और इसमें से एक सुझाव जो कि में प्राकृतिक देरी शामिल करना था, किसी भी लॉगिन प्रयास - सिद्धांत यह है कि 1 या 2 सेकंड देरी वास्तविक उपयोगकर्ता के लिए कुछ भी नहीं है लेकिन गंभीर रूप से क्रूर बल के हमलों में बाधा डालती है।

+0

हालांकि कोई भी लॉगिन उपयोगकर्ता अनुभव को मार सकता है। – Loki

+0

यूनिक्स दुनिया में कोई भी असफल लॉगिन मानक है, लेकिन वेब ऐप भाग का तात्पर्य है कि एक हमलावर इसे कई धागे में कर सकता है, इसलिए एक साधारण टाइमआउट नहीं करता है, आपको कहीं भी लॉगिन प्रयास को स्टोर करना होगा और इसे एक्सेस करने और सत्यापित करने के लिए कुछ कोड बनाना होगा। – Loki

+0

बस सभी प्रयासों में देरी किसी को समानांतर में 50 अनुरोध चलाने से नहीं रोकती है। यही कारण है कि क्यों साइमन विलिसन आईपी एड्रेस को कैश में टाइमस्टैंप के साथ स्टोर करता है। –

7

मुझे लगता है कि यहां तक ​​कि ईएचसीएच भी एक नापसंद बम के साथ एक फ्लाई मार रहा है। समस्या सरल है और कार्यान्वयन भी है।

मैं एक सर्वलेट फ़िल्टर का उपयोग शीर्ष स्तर का उपयोग करने का सुझाव देता हूं ताकि जितना संभव हो उतना कम प्रोसेसिंग किया जा सके।

निम्नलिखित स्टोर करने के लिए एक कक्षा बनाएं:

: समय

अब

  • प्रयासों की संख्या (गिनती)
  • , कोड एक sunchronized ब्लॉक में सरल है
    if userid not in attemptMap: 
        attemptMap.add (userid, new attemptItem (userid, 1, now)) 
    else 
        tmp = attemptMap.get (userid) 
        if (acquire lock for tmp) : 
         if tmp.time + 30 > now : 
          tmp.count = 0 
          tmp.time = now 
         tmp.count++ 
         if tmp.count > 3 : 
          error=true 
         release lock for tmp 
        else : error=true 
    

    यह मनुष्य है (जब तक कोड सिंक्रनाइज़ किया जाता है)।

+0

खातों को मजबूर करने के लिए क्रूर करता है, मैंने जावा में एक समाधान के लिए कहा है, यह स्पष्ट रूप से जावा नहीं है। इसके अलावा, अपनी टिप्पणियों पर विचार करते हुए: मैं एक ठोस और अच्छी तरह से परीक्षण समाधान की तलाश में हूं, कुछ मिनटों में एक साथ फेंक दिया नहीं। एक थ्रॉटलिंग सिस्टम जो कुछ घंटों या कुछ के बाद deadlocks बहुत उपयोगी नहीं है। –

+0

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

+0

एक साधारण सिंक्रनाइज़ किए गए मानचित्र या वेक्टर को यह करना चाहिए। आपको इसके लिए ehCache जैसी प्रणालियों की आवश्यकता नहीं है। – Loki

0

मैंने उपयोगकर्ता विवरण के साथ एक लॉगिन प्रयास गिनती फ़ील्ड का उपयोग किया है। जब यह 50 हो जाता है, तो सही पासवर्ड अस्वीकार कर दिए जाते हैं और उपयोगकर्ता को पासवर्ड रीसेट करना होता है।

+1

कुछ निश्चित उपयोगकर्ताओं को करने का एक आसान तरीका लगता है। –

+1

घातीय देरी का कोई भी रूप होने के नाते। सबसे महत्वपूर्ण बात यह है कि जैसे ही समय चल रहा है, उपयोगकर्ता को डॉस के लिए आसान और आसान हो जाता है (क्योंकि प्रत्येक अतिरिक्त जानबूझकर असफल असफल काम करता है) – SCdF

0

लॉगिन प्रयासों के बीच समय में घातीय वृद्धि के बारे में क्या?

1

एक यह है कि उल्लेख नहीं किया गया है उन्हें भूले हुए पासवर्ड सवाल (रों) का जवाब तो सारे गलत प्रयासों + अपना पासवर्ड डाल के बाद बनाना है

0

ehcache, बहुत अच्छी है, और अधिक महत्वपूर्ण बात करके आप लिखा है इसलिए आपको सुविधाओं को दोबारा नहीं करना है और संभवतः उन्हें गलत समझना है।

मेरा समाधान या तो ईएचसीएच या कुछ आसान (यदि यह एक छोटा ऐप था और मुझे वास्तव में समवर्ती प्रदर्शन की परवाह नहीं थी) लॉगिन कोड में शामिल होगा।

आप प्रति आईपी, असफल गिनती और टाइमस्टैम्प स्टोर करेंगे।

  • प्रत्येक बार जब आप लॉगिन प्रयास करते हैं, तो कसरत करें कि उन्हें विफल गिनती और टाइमस्टैम्प का उपयोग करने की अनुमति है या नहीं।
  • हर बार जब आप एक स्वीकृत लॉगिन प्रयास करते हैं और असफल होते हैं, तो असफल गणना 1 तक बढ़ जाती है और विफल समय रिकॉर्ड होती है।
  • प्रत्येक बार जब आप एक लॉगिन लॉगिन प्रयास करते हैं और उस आईपी के लिए जानकारी को स्पष्ट करते हैं।
0

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

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