हमें क्लाइंट कंप्यूटर पर JWT को स्टोर करना होगा। अगर हम इसे एक लोकलस्टोरेज / सेशनस्टोरेज में स्टोर करते हैं तो इसे एक्सएसएस के हमले से आसानी से पकड़ा जा सकता है। अगर हम इसे कुकीज में स्टोर करते हैं तो एक हैकर CSRF हमले में इसका इस्तेमाल कर सकता है (इसे पढ़े बिना) और उपयोगकर्ता को प्रतिरूपित करके हमारे एपीआई से संपर्क कर सकता है और कार्रवाई करने या उपयोगकर्ता की ओर से जानकारी प्राप्त करने के लिए अनुरोध भेज सकता है।
लेकिन कुकीज़ में जेडब्ल्यूटी को आसानी से चोरी न करने के कई तरीके हैं (लेकिन उन्हें चोरी करने के लिए अभी भी कुछ उन्नत तकनीकें हैं)। लेकिन अगर आप लोकलस्टोरेज / सेशनस्टोरेज पर भरोसा करना चाहते हैं, तो इसे एक साधारण XSS अटैक द्वारा एक्सेस किया जा सकता है।
तो CSRF समस्या को हल करने के लिए, मैं अपने आवेदन में डबल सबमिट कुकीज़ का उपयोग करता हूं।
कुकीज विधि को डबल जमा करें
JWT को एक HttpOnly कुकी में स्टोर करें और इसे HTTPS पर स्थानांतरित करने के लिए सुरक्षित मोड में उपयोग करें।
CSRF के अधिकांश हमलों में उनके अनुरोध में आपके मूल होस्ट के साथ एक अलग मूल या रेफ़र हैडर होता है। इसलिए जांचें कि क्या आपके पास उनमें से कोई हैडर है, क्या वे आपके डोमेन से आ रहे हैं या नहीं! यदि उन्हें अस्वीकार नहीं किया जाता है। यदि अनुरोध में मूल और संदर्भकर्ता दोनों उपलब्ध नहीं हैं तो कोई चिंता नहीं है। आप X-XSRF-TOKEN हैडर सत्यापन परिणामों के परिणाम पर भरोसा कर सकते हैं जो मैं अगले चरण में समझाता हूं।
जबकि ब्राउज़र स्वचालित रूप से आपके डोमेन को अनुरोध के डोमेन के लिए आपूर्ति करेगा, एक उपयोगी सीमा है: एक वेबसाइट पर चल रहा जावास्क्रिप्ट कोड अन्य वेबसाइटों के कुकीज़ को नहीं पढ़ सकता है। हम अपना CSRF समाधान बनाने के लिए इसका लाभ उठा सकते हैं। CSRF हमलों को रोकने के लिए, हमें एक अतिरिक्त जावास्क्रिप्ट पठनीय कुकी बनानी चाहिए, जिसे कहा जाता है: XSRF-TOKEN। यह कुकी तब बनाई जानी चाहिए जब उपयोगकर्ता लॉग इन हो और इसमें एक यादृच्छिक, बिना अनुमान के स्ट्रिंग होना चाहिए। हम निजी दावा के रूप में JWT में भी इस संख्या को बचाते हैं। हर बार जब जावास्क्रिप्ट एप्लिकेशन एक अनुरोध करना चाहता है, तो उसे इस टोकन को पढ़ना होगा और इसे कस्टम HTTP हेडर में भेजना होगा। क्योंकि ये ऑपरेशन (कुकी पढ़ना, हेडर सेट करना) केवल जावास्क्रिप्ट एप्लिकेशन के एक ही डोमेन पर किए जा सकते हैं,
कोणीय जेएस आपके जीवन को आसान बनाता है
सौभाग्य से, मैं अपने मंच में कोणीय जेएस का उपयोग कर रहा हूं और कोणीय सीएसआरएफ टोकन दृष्टिकोण को लागू करता है, जिससे हमारे लिए इसे लागू करना सरल हो जाता है। हर अनुरोध के लिए कि हमारा कोणीय अनुप्रयोग सर्वर से बनता है, कोणीय $http
सेवा इन चीजों को स्वचालित रूप से करेगी:
- वर्तमान डोमेन पर XSRF-TOKEN नामक कुकी की तलाश करें।
- यदि वह कुकी पाई जाती है, तो वह मूल्य पढ़ता है और इसे X-XSRF-TOKEN हैडर के रूप में अनुरोध में जोड़ता है।
इस प्रकार क्लाइंट-साइड कार्यान्वयन आपके लिए स्वचालित रूप से नियंत्रित किया जाता है! हमें XSRF-TOKEN
सर्वर साइड में वर्तमान डोमेन पर एक कुकी सेट करने की आवश्यकता है और जब हमारे एपीआई को क्लाइंट से कोई कॉल मिलता है, तो उसे X-XSRF-TOKEN
हेडर की जांच करनी चाहिए और XSRF-TOKEN
JWT में इसकी तुलना करनी चाहिए । यदि वे मेल खाते हैं, तो उपयोगकर्ता वास्तविक है। अन्यथा, यह एक जाली अनुरोध है और आप इसे अनदेखा कर सकते हैं। यह विधि "डबल सबमिट कुकी" विधि से प्रेरित है।
सावधान
वास्तव में, आप अभी भी XSS के लिए अतिसंवेदनशील हैं, यह सिर्फ इतना है कि हमलावर आपको JWT टोकन को बाद में उपयोग करने के लिए नहीं चुरा सकता है, लेकिन वह अभी भी XSS का उपयोग करके आपके उपयोगकर्ताओं की ओर से अनुरोध कर सकता है।
चाहे आप अपने JWT को स्टोर करें localStorage
या आप अपने XSRF-token को HttpOnly कुकी में न रखें, दोनों को XSS द्वारा आसानी से पकड़ा जा सकता है। यहां तक कि एक HttpOnly कुकी में आपके JWT को XST विधि जैसे उन्नत XSS हमले द्वारा पकड़ा जा सकता है ।
तो डबल सबमिट कुकीज़ विधि के अलावा, आपको हमेशा XSS के खिलाफ सर्वोत्तम प्रथाओं का पालन करना चाहिए जिसमें सामग्री बचाना भी शामिल है। इसका मतलब यह है कि किसी भी निष्पादन योग्य कोड को हटाने से ब्राउज़र को कुछ ऐसा करने का कारण होगा जो आप इसे नहीं चाहते हैं। आमतौर पर इसका मतलब है // <![CDATA[
टैग और HTML विशेषताओं को हटाना जो जावास्क्रिप्ट का मूल्यांकन करते हैं।
यहाँ और पढ़ें: