2008-11-04 9 views
44

मुझे लगता है कि iframe/p3p चाल सबसे लोकप्रिय है, लेकिन मुझे व्यक्तिगत रूप से यह पसंद नहीं है क्योंकि जावास्क्रिप्ट + छुपे हुए फ़ील्ड + फ्रेम वास्तव में इसे हैक जॉब की तरह दिखते हैं। मैं संवाद करने के लिए वेब सेवा का उपयोग कर मास्टर-गुलाम दृष्टिकोण में भी आया हूं (http://www.15seconds.com/issue/971108.htm) और यह बेहतर लगता है क्योंकि यह उपयोगकर्ता के लिए पारदर्शी है और यह विभिन्न ब्राउज़रों के खिलाफ मजबूत है।आपका पसंदीदा क्रॉस डोमेन कुकी साझा करने का दृष्टिकोण क्या है?

क्या कोई बेहतर दृष्टिकोण है, और प्रत्येक के पेशेवर और विपक्ष क्या हैं?

उत्तर

57

मेरा दृष्टिकोण एक डोमेन को 'केंद्रीय' डोमेन और किसी अन्य को 'उपग्रह' डोमेन के रूप में नामित करता है।

जब कोई 'साइन इन' लिंक (या एक सतत लॉगिन कुकी प्रस्तुत करता है) पर क्लिक करता है, तो साइन इन फॉर्म आखिरकार केंद्रीय डेटा पर एक यूआरएल को भेजता है, जिसमें एक छिपी हुई फॉर्म तत्व के साथ यह कहता है कि कौन सा डोमेन से आया (बस सुविधा के लिए, इसलिए उपयोगकर्ता को बाद में रीडायरेक्ट किया जाता है)।

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

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

अब, उपयोगकर्ता के पास केंद्रीय डोमेन और उपग्रह डोमेन दोनों में एक सत्र कुकी है। लेकिन क्या होगा यदि वे किसी अन्य उपग्रह की यात्रा करें? खैर, आम तौर पर, वे उपग्रह को अनधिकृत के रूप में दिखाई देंगे।

हालांकि, मेरे आवेदन के दौरान, जब भी कोई उपयोगकर्ता वैध सत्र में होता है, तो अन्य सैटेलाइट डोमेन पर पृष्ठों के सभी लिंक में एक या & एस शामिल होता है। मैं इस क्वेरी की स्ट्रिंग को "केंद्रीय सर्वर से जांचने के लिए आरक्षित करता हूं क्योंकि हम मानते हैं कि इस उपयोगकर्ता के पास सत्र है"। यही है, किसी भी एचटीएमएल पेज पर कोई टोकन या सत्र आईडी नहीं दिखाया जाता है, केवल अक्षर 'जो किसी की पहचान नहीं कर सकता है।

ऐसे यूआरएल को प्राप्त करने वाला यूआरएल, यदि कोई वैध सत्र अभी तक नहीं है, तो केंद्रीय डोमेन पर रीडायरेक्ट करें, "क्या आप मुझे बता सकते हैं कि यह कौन है?" क्वेरी स्ट्रिंग में कुछ डालने से।

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

मेरा समाधान स्क्रिप्ट के बिना काम करता है, या iframe समर्थन। इसे किसी भी क्रॉस-डोमेन यूआरएल में जोड़ने के लिए '? S' की आवश्यकता होती है जहां उपयोगकर्ता के पास उस यूआरएल पर अभी तक कुकी नहीं हो सकती है। मैंने इस बारे में सोचने के तरीके के बारे में सोचा था: जब उपयोगकर्ता पहले लॉग इन करता है, तो प्रत्येक डोमेन पर रीडायरेक्ट की एक श्रृंखला सेट अप करें, प्रत्येक पर एक सत्र कुकी सेट करें। एकमात्र कारण मैंने इसे लागू नहीं किया है कि यह जटिल होगा कि आपको एक सेट ऑर्डर करने में सक्षम होना होगा कि ये रीडायरेक्ट कब और कब रुकेंगे, और आपको 15 डोमेन से आगे बढ़ने से रोक देगा (बहुत अधिक और आप खतरनाक रूप से कई ब्राउज़रों और प्रॉक्सी की 'रीडायरेक्ट सीमा' के करीब हो जाते हैं)।

+7

यह oauth2 के समान है। आपने इसके शीर्ष पर स्वचालित लॉगिन स्तर दिया है, यदि आपके पास सभी ऐप्स हैं तो यह एक अच्छा विकल्प है। – matthuhiggins

+0

अच्छा जवाब, लेकिन मेरे पास आपके उत्तर पर कुछ विचार हैं: 1) आपको सैटेलाइट यूआरएल को रिटर्न के रूप में पास करने की आवश्यकता नहीं है, आप इसके लिए http हेडर यूआरएल-रेफरर का उपयोग कर सकते हैं। 2) आपका रिटर्न टोकन असुरक्षित है, भले ही यह एकमात्र उपयोग टोकन है, भले ही हमलावर रिटर्न पोस्टबैक को रोक सके और सत्यापन पूर्ण होने से पहले कॉलर ऐप के बाहर टोकन का उपयोग कर सके, सही दृष्टिकोण दास पर एक सुरक्षित कोड उत्पन्न करता है और सत्यापित करता है केंद्रीय डोमेन पर इस कोड के साथ टोकन, टोकन सार्वजनिक है लेकिन सुरक्षित कोड के बिना हमलावर के लिए बेकार है। –

+0

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

2

यदि आपके पास सभी डोमेन बैकएंड का पूर्ण नियंत्रण है तो यह एक अच्छा समाधान है। मेरी स्थिति में मेरे पास केवल क्लाइंट (जावास्क्रिप्ट/एचटीएमएल) नियंत्रण होता है, और दूसरे पर पूर्ण नियंत्रण होता है, इसलिए मुझे iframe/p3p विधि का उपयोग करने की आवश्यकता होती है, जो बेकार है :(

0

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

ध्यान रखें कि आपके return.asp किसी भी साइट पर रीडायरेक्ट करने के साथ दुर्व्यवहार किया जा सकता है (उदाहरण के लिए this देखें)।

0

ठीक है, मैं एक समाधान पाया है लगते हैं, तो आप एक स्क्रिप्ट टैग है कि भार बना सकते हैं डू का स्रोत मुख्य आप कुकीज़ को सेट/प्राप्त करना चाहते हैं ... केवल सफारी अब तक कुकीज़ सेट करने में सक्षम नहीं है, लेकिन आईई 6 और एफएफ ठीक काम करते हैं ... फिर भी यदि आप केवल कुकीज़ प्राप्त करना चाहते हैं, तो यह एक बहुत अच्छा तरीका है।

+0

सफारी में कुकी स्वीकृति वरीयता डिफ़ॉल्ट है जो केवल इसे कुकीज़ को स्वीकार करने की अनुमति देता है जिसे उपयोगकर्ता ने नेविगेट किया है। क्रोम और सफारी एक ही अंतर्निहित इंजन (वेबकिट) साझा करते हैं लेकिन क्रोम ने यह संपत्ति "सभी स्वीकार करें" पर सेट की है। डिफ़ॉल्ट सुरक्षा बहस के स्तर अलग-अलग हैं, यही कारण है कि सफार आपके व्यवस्था में काम नहीं करता है। – ScottCher

1

उस आलेख में उदाहरण मुझे संदिग्ध लगता है क्योंकि आप मूल रूप से एक यूआरएल पर रीडायरेक्ट करते हैं जो बदले में, क्वेरीस्ट्रिंग में आपके डोमेन पर वैरिएबल पास करता है।

उदाहरण में, इसका मतलब यह होता है कि एक दुर्भावनापूर्ण उपयोगकर्ता बस http://slave.com/return.asp?Return=blah&UID=123 पर नेविगेट कर सकता है "और उपयोगकर्ता के रूप में slave.com पर में लॉग इन होना 123.

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

+0

क्या किसी के पास इस प्रश्न का उत्तर है? ऐसा लगता है कि चयनित उत्तर लागू करने से पहले जानना महत्वपूर्ण होगा! – streetlight

+0

नहीं, क्योंकि मास्टर को रीडायरेक्ट के साथ एक अद्वितीय टोकन भेजना चाहिए जो उपग्रह मान्य कर सकता है। यह ध्यान दिया जाना चाहिए, जैसा कि http auth के सभी तंत्र के साथ, केवल https का उपयोग किया जाना चाहिए। यह oauth2 क्या करता है उससे बहुत अलग नहीं है। – ashwoods

-3

आप जो भी करते हैं वह डोमेन पर है जो आप रेफरर को चेक करते हैं पता भी है ताकि आप पुष्टि कर सकें कि लिंक आपके डोमेन से था और कोई भी पता बार में लिंक टाइप नहीं कर रहा था। यह दृष्टिकोण अच्छी तरह से काम करता है।

+9

रेफरर को – tamasd

0

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

1

@thomasrutter आप पृष्ठ लोड पर प्रमाणन की स्थिति के लिए 'केंद्रीय' डोमेन की जाँच करने के लिए एक ajax कॉल करके (क्वेरी स्ट्रिंग के लिए "एस" जोड़कर के माध्यम से) उपग्रहों पर सभी आउटबाउंड लिंक का प्रबंधन करने से बच सकता है। आप प्रति सत्र केवल एक करके अनावश्यक कॉल (बाद के पृष्ठ लोड पर) से बच सकते हैं।

यह पृष्ठ लोड से पहले ऑथ चेक अनुरोध सर्वर-पक्ष बनाने के लिए तर्कसंगत रूप से बेहतर होगा ताकि (ए) आपके पास सत्र में अधिक कुशल पहुंच हो, और (बी) आप पृष्ठ पर यह जान लेंगे कि उपयोगकर्ता प्रस्तुत करता है या नहीं लॉग इन है (और तदनुसार सामग्री प्रदर्शित करें)।

+0

पर किसी भी समय फिक्र किया जा सकता है 1. हम क्रॉस-डोमेन के बारे में बात कर रहे हैं, इसलिए AJAX डिफ़ॉल्ट रूप से 2 विकल्प नहीं है 2. आप बिना किसी रीडायरेक्ट के सर्वर पर जांच सकते हैं, क्योंकि आपके पास उपयोगकर्ता की पहचान करने के लिए कुछ भी नहीं है। –

संबंधित मुद्दे