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


107

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

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

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

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

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

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

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

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

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


1
आप प्रत्येक URL पर एक टोकन जोड़ सकते हैं। ASP.NET के पास ऐसा करने के लिए एक (विरासत) मोड है। यह साबित करता है कि यह काम कर सकता है।
usr

1
सब लोग कहाँ हैं? :)
टरडस-मेरुला

2
मुझे लगता है कि आपके पास उपलब्ध विकल्पों का एक अच्छा विचार है। अपने तर्क पर भरोसा करें और खुद फैसला करें।
usr

एक फ्लैश की सिल्वरलाइट की तरह एक प्लगइन एक विकल्प है?
Giu

@usr सुनिश्चित नहीं है कि यह एक अच्छा विचार है जैसे कि एक हैकर आपके वेबसेवर लॉग्स में जाता है, आपके टोकन को चुरा सकता है और आपके सिस्टम में लॉग इन कर सकता है।
जिबूको

जवाबों:


74

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

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

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

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

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

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


आप ऐसा नहीं करते हैं कि उपयोगकर्ता क्या करता है और उपयोगकर्ता को एक हस्ताक्षरित कुकी भेजता है? फिर उस कुकी को प्रत्येक बाद के अनुरोध के लिए सर्वर पर वापस भेज दिया गया है?
j

8
> उसका ब्राउज़र आहार पर है, इसलिए यह कुकीज़ का समर्थन नहीं करता है।
कार्तिक रंगराजन 1

4
क्या इनमें से कोई सुझाव वास्तव में स्टेटलेस / सेशनलेस है ? आपके पाँच प्रमुख पैराग्राफ में से (2013-12-19 पोस्ट के संस्करण के रूप में): # 1 परिचयात्मक है, # 2 अतिरिक्त extra kludgy Web2.0 ™ प्रस्तावित करता है avorFlavored सत्र, # 3 सिर्फ आराधन है, # 4 निहितार्थों पर चर्चा करता है राज्य का दर्जा , और # 5 एक अस्पष्ट आउट्रो है ... यह कैसे स्वीकार किया गया ?? यह tangentially सूचनात्मक सबसे अच्छा है!
जेम्स दिवालीवूड

1

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

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

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

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


3
एक सत्र सर्वर पर संग्रहीत स्थिति है। सवाल स्टेटलेस ऑथेंटिकेशन के लिए पूछता है।
कुबले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.