security - स्टेटलेस(सत्र-कम) और कुकी-कम प्रमाणीकरण कैसे करें?




authentication session-cookies (2)

आह, मुझे इन सवालों से प्यार है - सत्र के बिना सत्र बनाए रखना।

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

एक लोकप्रिय, हालांकि पूरी तरह से स्टेटलेस तंत्र नहीं है (मान लें कि आपके पास जावास्क्रिप्ट निष्पादन है) जावास्क्रिप्ट में सत्र कुकी को एम्बेड करना है। मुझ में सुरक्षा लड़का इस पर चिल्ला रहा है, लेकिन यह वास्तव में काम कर सकता है - प्रत्येक अनुरोध में X-Authentication-Token हेडर या ऐसा कुछ है, और आप बैकएंड पर डेटाबेस, मेमोरी में फाइल-स्टोर इत्यादि को मैप करते हैं। उपयोगकर्ता को प्रमाणित करने के लिए। इस टोकन में आपके द्वारा निर्दिष्ट किए गए समय का टाइमआउट हो सकता है, और यदि यह समय समाप्त हो जाता है, तो उपयोगकर्ता को फिर से लॉग इन करना होगा। यह काफी स्केलेबल है - यदि आप इसे डेटाबेस में संग्रहीत करते हैं, तो इसका एक SQL कथन निष्पादित होता है, और सही इंडेक्स के साथ, इसे एक साथ कई उपयोगकर्ताओं के साथ निष्पादित करने में बहुत कम समय लगना चाहिए। लोड परीक्षण यहां निश्चित रूप से मदद करेगा। अगर मैं सही ढंग से प्रश्न पढ़ता हूं, तो यह आपके एन्क्रिप्टेड टोकन तंत्र होगा - हालांकि, मैं दृढ़ता से सुझाव दूंगा कि आप 32 वर्णों के क्रिप्टोग्राफिक रूप से यादृच्छिक टोकन का उपयोग करते हैं, बनाम उपयोगकर्ता नाम + पासवर्ड + संयोजन का संयोजन का उपयोग करके बनाम - इस तरह, यह रहता है अप्रत्याशित, लेकिन आप अभी भी इसे उपयोगकर्ता आईडी या ऐसी किसी चीज़ से जोड़ सकते हैं।

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

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

ऐसी कुछ अन्य सुरक्षा चिंताओं हैं जिनके बारे में मैं सोच सकता हूं, लेकिन इस चरण में उन्हें संबोधित करने के लिए बहुत व्यापक हैं - यदि आप सभी उपयोग (और दुर्व्यवहार) मामलों को ध्यान में रखते हैं, तो संभवतः आपको काफी अच्छा कार्यान्वयन करने में सक्षम होना चाहिए यह प्रणाली।

कुछ हासिल करने के लिए बॉब एक ​​वेब एप्लिकेशन का उपयोग करता है। तथा:

  • उनका ब्राउज़र आहार पर है, इसलिए यह कुकीज़ का समर्थन नहीं करता है
  • वेब एप्लिकेशन एक लोकप्रिय है, यह किसी भी क्षण में बहुत से उपयोगकर्ताओं से संबंधित है - इसे अच्छी तरह से स्केल करना है । जब तक सत्र सत्र एक साथ कनेक्शन की संख्या को सीमित कर देगा , और, निश्चित रूप से, एक गैर-नगण्य प्रदर्शन जुर्माना लाएगा, हम एक सत्र-कम प्रणाली चाहते हैं :)

कुछ महत्वपूर्ण नोट्स:

  • हमारे पास परिवहन सुरक्षा है ( एचटीटीपीएस और इसके सबसे अच्छे दोस्त);
  • पर्दे के पीछे, वेब एप्लिकेशन बाहरी उपयोगकर्ताओं को वर्तमान सेवाओं की ओर से कई परिचालनों का प्रतिनिधित्व करता है (वे सिस्टम बॉब को उनके उपयोगकर्ताओं में से एक के रूप में पहचानते हैं) - इसका मतलब है कि हमें उन्हें बॉब के प्रमाण पत्र अग्रेषित करना होगा

अब, हम बॉब को प्रमाणित कैसे करते हैं (प्रत्येक अनुरोध पर)? ऐसी चीज को लागू करने का एक उचित तरीका कौन सा होगा?

  • एचटीएमएल फॉर्म छिपे हुए फ़ील्ड के माध्यम से प्रमाण पत्र के साथ टेनिस खेलना ... गेंद में प्रमाण-पत्र ( उपयोगकर्ता नाम और पासवर्ड ) शामिल हैं और दो रैकेट क्रमशः ब्राउज़र और वेब एप्लिकेशन हैं। दूसरे शब्दों में, हम कुकीज़ के माध्यम से फॉर्म फ़ील्ड के माध्यम से डेटा को आगे और आगे ले जा सकते हैं। प्रत्येक वेब अनुरोध पर, ब्राउज़र प्रमाण-पत्र पोस्ट करता है। हालांकि, एकल पृष्ठ के आवेदन के मामले में, यह टेनिस खेलने के बजाए रबड़ की दीवार के खिलाफ स्क्वैश खेलना जैसा दिख सकता है, क्योंकि क्रेडेंशियल्स वाले वेब फॉर्म को वेब पेज के पूरे जीवनकाल में जीवित रखा जा सकता है (और सर्वर कॉन्फ़िगर किया जाएगा क्रेडेंशियल वापस देने के लिए नहीं)।
  • पृष्ठ के संदर्भ में उपयोगकर्ता नाम और पासवर्ड संग्रहीत करना - जावास्क्रिप्ट चर आदि। एकल पृष्ठ यहां आवश्यक है, IMHO।
  • एन्क्रिप्टेड टोकन आधारित प्रमाणीकरण। इस मामले में, लॉग-इन कार्रवाई के परिणामस्वरूप एन्क्रिप्टेड सुरक्षा टोकन (उपयोगकर्ता नाम + पासवर्ड + कुछ और) की पीढ़ी होगी। यह टोकन ग्राहक को वापस दिया जाएगा और आगामी अनुरोध टोकन के साथ होंगे। इसका कोई मतलब भी है क्या? हमारे पास पहले से ही HTTPS है ...
  • दूसरों ...
  • अंतिम उपाय: ऐसा मत करो, सत्र में प्रमाण पत्र स्टोर करें! सत्र अच्छा है। कुकीज़ के साथ या बिना।

क्या पहले से वर्णित विचारों में से किसी के बारे में कोई भी वेब / सुरक्षा चिंता आपके दिमाग में आती है? उदाहरण के लिए,

  • टाइम-आउटिंग - हम क्रेडेंशियल्स के साथ टाइमस्टैम्प रख सकते हैं (टाइम-स्टैम्प = जिस समय बॉब ने अपने क्रेडेंशियल दर्ज किए थे)। जैसे जब अब - टाइमस्टैम्प> थ्रेसहोल्ड , हम अनुरोध को अस्वीकार कर सकते हैं।
  • क्रॉस-साइट स्क्रिप्टिंग सुरक्षा - किसी भी तरह से अलग नहीं होनी चाहिए, है ना?

इसे पढ़ने के लिए समय लेने के लिए बहुत बहुत धन्यवाद :)


लॉग-इन विकल्प के बारे में - मुझे लगता है कि आमतौर पर आप मेहमानों के लिए सत्रों का भी समर्थन करना चाहते हैं।

इसलिए, यदि आप लॉगिन को लागू करना चाहते हैं, तो एन्क्रिप्टेड टोकन विकल्प अच्छा हो सकता है। यह किसी भी तरह अतिथि सत्र के लिए भी अच्छा हो सकता है। एक और दिशा में, मैं टोकन को यूआरएल और टेनिस विकल्प में जोड़ने के बीच गठबंधन करूंगा।

ध्यान दें कि केवल यूआरएल में प्रमाण पत्र भेजना खतरनाक हो सकता है। उदाहरण के लिए, आप HTTP रेफरर हेडर के माध्यम से टोकन को रिसाव कर सकते हैं या यहां तक ​​कि किसी ऐसे व्यक्ति द्वारा जो आपके ट्रैफ़िक का निरीक्षण करता है या आपके कंप्यूटर को देखता है।

एक और बात, भले ही आप कुकीज़ का उपयोग कर सकें, मैं आपको क्रॉस साइट अनुरोध फोर्जरी (सीएसआरएफ) हमलों से बचाने के लिए यादृच्छिक टोकन या यादृच्छिक सत्यापन जोड़ने की सलाह दूंगा।





cookieless