authentication - स्टेटलेस(= सत्रहीन) प्रमाणीकरण का उपयोग करते समय सीएसआरएफ टोकन आवश्यक है?




csrf single-page-application (2)

एक जेडब्ल्यूटी, यदि कुकीज के बिना इस्तेमाल किया जाता है, तो सीएसआरएफ टोकन की आवश्यकता को अस्वीकार करता है - लेकिन! सत्र / लोकल स्टोरेज में जेडब्ल्यूटी को संग्रहीत करके, यदि आपकी साइट में एक्सएसएस भेद्यता (काफी आम है) तो आप अपने जेडब्ल्यूटी और उपयोगकर्ता की पहचान का पर्दाफाश करते हैं। जेडब्ल्यूटी को csrfToken कुंजी जोड़ने और secure और http-only विशेषता सेट के साथ एक कुकी में जेडब्ल्यूटी को स्टोर करना बेहतर है।

अधिक जानकारी के लिए इस आलेख को एक अच्छी जानकारी के साथ पढ़ें https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage

आप इस सीएसआरएफ सुरक्षा को एक xsrfToken जेडब्ल्यूटी दावा सहित स्टेटलेस बना सकते हैं:

{ "iss": "http://galaxies.com", "exp": 1300819380, "scopes": ["explorer", "solar-harvester", "seller"], "sub": "[email protected]", "xsrfToken": "d9b9714c-7ac0-42e0-8696-2dae95dbc33e" }

तो आपको csrf टोकन को स्थानीय स्टोरेज / सत्र स्टोरेज के साथ-साथ जेडब्ल्यूटी में ही स्टोर करना होगा (जो केवल http- और सुरक्षित कुकी में संग्रहीत है)। फिर सीएसआरएफ सुरक्षा के लिए, सत्यापित करें कि जेडब्ल्यूटी में सीएसआरएफ टोकन जमा सीएसआरएफ-टोकन हेडर से मेल खाता है।

क्या सीएसआरएफ संरक्षण का उपयोग करना आवश्यक है जब एप्लिकेशन स्टेटलेस प्रमाणीकरण (एचएमएसी जैसे कुछ का उपयोग कर) पर निर्भर करता है?

उदाहरण:

  • हमारे पास एक पृष्ठ ऐप है (अन्यथा हमें प्रत्येक लिंक पर टोकन जोड़ना होगा: <a href="...?token=xyz">...</a>

  • उपयोगकर्ता POST /auth का उपयोग करके खुद को प्रमाणित करता है। सफल प्रमाणीकरण पर सर्वर कुछ टोकन वापस करेगा।

  • टोकन को एकल पेज ऐप के अंदर कुछ चर में जावास्क्रिप्ट के माध्यम से संग्रहीत किया जाएगा।

  • इस टोकन का उपयोग प्रतिबंधित यूआरएल जैसे /admin तक पहुंचने के लिए किया जाएगा।

  • टोकन हमेशा HTTP शीर्षकों के अंदर प्रेषित किया जाएगा।

  • कोई एचटीपी सत्र नहीं है, और कोई कुकीज़ नहीं है।

जहां तक ​​मैं समझता हूं, वहां (?!) को क्रॉस साइट हमलों का उपयोग करने की कोई संभावना नहीं होनी चाहिए, क्योंकि ब्राउजर टोकन को स्टोर नहीं करेगा, और इसलिए यह स्वचालित रूप से इसे सर्वर पर नहीं भेज सकता है (यही वह कुकीज / सत्र)।

क्या मैं कुछ भूल रहा हूँ?


मुझे प्रमाणीकरण के लिए कोई कुकीज़ का उपयोग कर सीएसआरएफ + के बारे में कुछ जानकारी मिली:

  1. https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/
    "चूंकि आप कुकीज़ पर भरोसा नहीं कर रहे हैं, इसलिए आपको क्रॉस साइट अनुरोधों के खिलाफ सुरक्षा की आवश्यकता नहीं है"

  2. http://angular-tips.com/blog/2014/05/json-web-tokens-introduction/
    "अगर हम कुकीज़ के रास्ते पर जाते हैं, तो आपको क्रॉस साइट अनुरोधों से बचने के लिए वास्तव में सीएसआरएफ करना होगा। जेडब्ल्यूटी का उपयोग करते समय हम कुछ भूल सकते हैं।"
    (जेडब्ल्यूटी = जेसन वेब टोकन, स्टेटलेस ऐप्स के लिए टोकन आधारित प्रमाणीकरण)

  3. http://www.jamesward.com/2013/05/13/securing-single-page-apps-and-rest-services
    "सीएसआरएफ भेद्यता को जोखिम के बिना प्रमाणीकरण करने का सबसे आसान तरीका उपयोगकर्ता की पहचान करने के लिए कुकीज़ का उपयोग करने से बचाना है"

  4. http://sitr.us/2011/08/26/cookies-are-bad-for-you.html
    "सीएसआरएफ के साथ सबसे बड़ी समस्या यह है कि कुकीज़ इस प्रकार के हमले के खिलाफ पूरी तरह से कोई रक्षा प्रदान नहीं करती हैं। यदि आप कुकी प्रमाणीकरण का उपयोग कर रहे हैं तो आपको सीएसआरएफ के खिलाफ सुरक्षा के लिए अतिरिक्त उपायों का भी उपयोग करना होगा। सबसे बुनियादी सावधानी बरतने के लिए यह सुनिश्चित करना है कि आपका आवेदन जीईटी अनुरोधों के जवाब में कभी भी दुष्प्रभाव नहीं करता है। "

यदि आप प्रमाणीकरण के लिए कुकीज़ का उपयोग नहीं करते हैं, तो बहुत सारे पृष्ठ हैं, जो बताते हैं कि आपको किसी भी सीएसआरएफ सुरक्षा की आवश्यकता नहीं है। बेशक आप अभी भी बाकी सब कुछ के लिए कुकीज़ का उपयोग कर सकते हैं, लेकिन इसके अंदर session_id जैसे कुछ भी संग्रहीत करने से बचें

यदि आपको उपयोगकर्ता को याद रखने की आवश्यकता है, तो 2 विकल्प हैं:

  1. localStorage : एक इन-ब्राउजर कुंजी-मूल्य स्टोर। संग्रहीत डेटा ब्राउज़र विंडो को बंद करने के बाद भी उपलब्ध होगा। डेटा अन्य वेबसाइटों द्वारा उपलब्ध नहीं है, क्योंकि प्रत्येक साइट को अपना भंडारण मिलता है।

  2. sessionStorage : ब्राउज़र ब्राउज़र स्टोर में भी एक। अंतर यह है कि जब उपयोगकर्ता ब्राउज़र विंडो बंद करता है तो डेटा हटा दिया जाता है। लेकिन यह अभी भी उपयोगी है, अगर आपके वेबपैप में कई पेज हैं। तो आप निम्न कार्य कर सकते हैं:

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

(दोनों के लिए यहां एक नज़र डालें: http://www.w3schools.com/html/html5_webstorage.asp )

टोकन ऑथ के लिए कोई आधिकारिक मानदंड हैं?

जेडब्ल्यूटी (जेसन वेब टोकन): मुझे लगता है कि यह अभी भी एक मसौदा है, लेकिन यह पहले से ही कई लोगों द्वारा उपयोग किया जाता है और अवधारणा सरल और सुरक्षित दिखती है। (आईईटीएफ: http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-25 )
बहुत सारे ढांचे के लिए पुस्तकालय भी उपलब्ध हैं। इसके लिए बस गूगल!





csrf-protection