2010-04-09 18 views
6

मैं उपयोगकर्ता प्रमाणित रखने के लिए स्प्रिंग सिक्योरिटी की यादगार सेवाओं का उपयोग कर रहा हूं।वसंत सुरक्षा याद रखें मेरी कुकी सत्र

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

इस पर सबसे अच्छा तरीका कैसे लागू करें इस पर कोई सुझाव? इस पर कोई चिंता एक संभावित सुरक्षा समस्या है?

ऐसा करने का प्राथमिक कारण यह है कि कुकी-आधारित टोकन के साथ, हमारे लोड बैलेंसर के पीछे के किसी भी सर्वर को किसी HttpSession में संग्रहीत करने के लिए उपयोगकर्ता के प्रमाणीकरण पर भरोसा किए बिना संरक्षित अनुरोध की सेवा कर सकते हैं। असल में, मैंने स्प्रिंग सिक्योरिटी को स्पष्ट रूप से नामस्थान का उपयोग करके सत्र बनाने के लिए कहा है। इसके अलावा, हम अमेज़ॅन के लोचदार लोड संतुलन का उपयोग कर रहे हैं, और इसलिए चिपचिपा सत्र समर्थित नहीं हैं।

एनबी: हालांकि मुझे पता है कि अप्रैल 08 तक, अमेज़ॅन अब चिपचिपा सत्रों का समर्थन करता है, फिर भी मैं उन्हें कुछ अन्य कारणों से उपयोग नहीं करना चाहता हूं। अर्थात् एक सर्वर का असामयिक निधन अभी भी इसके साथ जुड़े सभी उपयोगकर्ताओं के लिए सत्रों के नुकसान का कारण बन जाएगा। http://aws.amazon.com/about-aws/whats-new/2010/04/08/support-for-session-stickiness-in-elastic-load-balancing/

+0

क्यों क्या आप बस अपने खुद के RememberMe कार्यान्वयन को लागू नहीं करते हैं? यह काफी आसान है। – lexicore

+0

डुप्लिकेट? http://stackoverflow.com/questions/2594960/best-practice-to-implement-secure-remember-me – rook

+0

@lexicore लोग अपने स्वयं के सत्र लागू करने वाले लोगों को आपके वेब ऐप पर वास्तविक विनाश ला सकते हैं। पहिया का पुन: आविष्कार न करें। "डुप्लिकेट" पर मेरी पोस्ट पढ़ें? ऊपर सवाल – rook

उत्तर

3

लोड संतुलन के साथ सत्र सही तरीके से काम करने के लिए मेरे पास एक सत्र डेटाबेस में आपका सत्र डेटा संग्रहीत होगा।

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

ए 3 पढ़ें: 2010 के लिए ओडब्ल्यूएएसपी शीर्ष 10 में "टूटा प्रमाणीकरण और सत्र प्रबंधन"। इस खंड में एक महत्वपूर्ण बिंदु यह है कि पूरे सत्र के लिए https का उपयोग किया जाना चाहिए। यदि सत्र बहुत लंबे समय तक चल रहा है, तो यह और भी महत्वपूर्ण है।

यह भी ध्यान रखें कि "मुझे याद रखें" एक बड़ी खिड़की बनाता है जिसमें एक हमलावर सत्र पर "सवारी" कर सकता है। यह हमलावर को बहुत लंबा समय देता है (महीनों?) जिसमें वह एक सीएसआरएफ हमला कर सकता है। यहां तक ​​कि यदि आपके पास सीएसआरएफ सुरक्षा है तो भी हमलावर XSS और XmlHttpRequest (HttpOnlyCookies एक पूर्ण अपहरण को रोक देगा) के साथ एक सत्र पर सवारी कर सकता है। "मुझे याद रखें" xss, csrf जैसे अन्य खतरों को और अधिक गंभीर बनाता है। जब तक इन भेद्यता को संबोधित किया गया है, तब तक आपको असली दुनिया हैकर्स के साथ कोई समस्या नहीं होनी चाहिए।

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

+0

प्रत्येक अनुरोध पर एक नया टोकन बनाने की तुलना में एक कस्टम RememberMe फ़िल्टर के बारे में क्या है। नए टोकन में एक छोटा जीवनकाल हो सकता है, उदा। 20 मिनट। यदि उपयोगकर्ता कुछ भी नहीं करता है, तो टोकन समाप्त हो जाता है। यदि उपयोगकर्ता 20 मिनट की विंडो में एक और अनुरोध करता है, तो एक नई 20 मिनट की विंडो बनाई गई है। यदि उपयोगकर्ता का सत्र किसी भी तरह चोरी हो जाता है, तो उपयोगकर्ता का पासवर्ड बदलना जंगली में किसी वैध टोकन को अभी भी अमान्य कर देगा ... विचार? –

+0

मुझे याद है मैं कहाँ से पहले इस विचार के बारे में सुना ... यह एक डेटाबेस के लिए टोकन के हठ आवश्यकता है, लेकिन नहीं एक HttpSession: http://jaspan.com/improved_persistent_login_cookie_best_practice शायद मैं वसंत में PersistentTokenBasedRememberMeService उपवर्गीकरण पर ध्यान देंगे सुरक्षा। –

5

वसंत सुरक्षा 3 कुकी उत्पन्न होने के तरीके की कॉन्फ़िगरेशन प्रदान नहीं करता है।आप डिफ़ॉल्ट व्यवहार को ओवरराइड करने के लिए है: है

import javax.servlet.http.Cookie; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices; 

/** Cookie expires on session. */ 
public class PersistentTokenBasedRememberMeServicesCustom extends 
    PersistentTokenBasedRememberMeServices { 

    /** only needed because super throws exception. */ 
    public PersistentTokenBasedRememberMeServicesCustom() throws Exception { 
    super(); 
    } 

    /** Copy of code of inherited class + setting cookieExpiration, */ 
    @Override 
    protected void setCookie(String[] tokens, int maxAge, 
     HttpServletRequest request, HttpServletResponse response) { 
    String cookieValue = encodeCookie(tokens); 
    Cookie cookie = new Cookie(getCookieName(), cookieValue); 
    //cookie.setMaxAge(maxAge); 
    cookie.setPath("/"); 
    cookie.setSecure(false); // no getter available in super, so always false 

    response.addCookie(cookie); 
    } 
} 

सुनिश्चित करें, तो आप इस अनुकूलित PersistentTokenBasedRememberMeServices का उपयोग आप इसे करने के वर्ग नाम जोड़कर rememberMeService रहे के लिए सेम विन्यास:

<beans:bean id="rememberMeServices" 
class="my.custom.spring.PersistentTokenBasedRememberMeServicesCustom"/> 
संबंधित मुद्दे