HTTP कुकीज़ पोर्ट विशिष्ट हैं?


355

मेरे पास एक मशीन पर दो HTTP सेवाएं चल रही हैं। मैं सिर्फ यह जानना चाहता हूं कि क्या वे अपनी कुकी साझा करते हैं या क्या ब्राउज़र दो सर्वर सॉकेट के बीच अंतर करता है।

जवाबों:


329

वर्तमान कुकी विनिर्देश RFC 6265 है , जो RFC 2109 और RFC 2965 को प्रतिस्थापित करता है (दोनों RFC को अब "ऐतिहासिक" के रूप में चिह्नित किया गया है) और कुकीज़ के वास्तविक-विश्व usages के लिए सिंटैक्स को औपचारिक रूप दिया गया है। यह स्पष्ट रूप से बताता है:

  1. परिचय

...

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

और भी:

8.5। कमजोर गोपनीयता

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


129

RFC2965 3.3.1 के अनुसार (जो ब्राउज़रों द्वारा अनुसरण नहीं किया जा सकता है), जब तक कि पोर्ट हेडर के portपैरामीटर के माध्यम से स्पष्ट रूप से निर्दिष्ट नहीं किया जाता है Set-Cookie, कुकीज़ को किसी भी पोर्ट पर भेजा जा सकता है या नहीं भेजा जा सकता है।

Google की ब्राउज़र सुरक्षा हैंडबुक कहती है: डिफ़ॉल्ट रूप से, कुकी का दायरा वर्तमान होस्ट नाम के सभी URL तक सीमित है - और पोर्ट या प्रोटोकॉल जानकारी के लिए बाध्य नहीं है। और कुछ पंक्तियाँ बाद में केवल एक DNS नाम के लिए कुकीज़ को सीमित करने का कोई तरीका नहीं है [...] इसी तरह, उन्हें एक विशिष्ट बंदरगाह तक सीमित करने का कोई तरीका नहीं है। (इसके अलावा, यह ध्यान रखें, कि IE इसकी एक ही मूल नीति में कारक पोर्ट संख्या करता है सब पर ।)

इसलिए यहां किसी भी परिभाषित व्यवहार पर भरोसा करना सुरक्षित नहीं लगता है।


75
RFC 6265 , जो RFC 2965 को प्रतिस्थापित Portकरता है, Set-Cookieहेडर में पैरामीटर को समाप्त कर देता है (क्योंकि लगभग किसी ने वास्तव में इसका उपयोग नहीं किया है), और यह बहुत स्पष्ट करता है कि एक ही मेजबान पर कुकीज़ अब बंदरगाहों द्वारा दूर नहीं हैं।
रेमी लेबेउ

5
IE 9 भी बाद के अनुरोधों पर कुकी वापस नहीं भेजेगा यदि डोमेन में एक पोर्ट है
axk

3
क्या कोई ऐसा ब्राउज़र है जो अभी भी अपने कुकीज SOP में पोर्ट पर विचार कर रहा है?
बर्टुज

5
यदि डोमेन में पोर्ट है तो क्रोम कुकी को सेट भी नहीं करेगा।
पिम हाइजेन

76

यह वास्तव में एक पुराना सवाल है, लेकिन मुझे लगा कि मैं अपने द्वारा इस्तेमाल किया जाने वाला वर्कअराउंड जोड़ दूंगा।

मेरे पास अपने लैपटॉप पर दो सेवाएं चल रही हैं (एक पोर्ट 3000 पर और दूसरा 4000 पर)। जब मैं ( http://localhost:3000और http://localhost:4000) के बीच कूद जाता , तो क्रोम उसी कुकी में पास हो जाता, प्रत्येक सेवा कुकी को नहीं समझती और एक नया निर्माण करती।

मैंने पाया कि अगर मैंने एक्सेस किया http://localhost:3000और http://127.0.0.1:4000, समस्या दूर हो गई क्योंकि क्रोम ने लोकलहोस्ट के लिए एक कुकी और 127.0.0.1 के लिए एक रखा।

फिर, कोई भी इस बिंदु पर ध्यान नहीं दे सकता है लेकिन यह मेरी स्थिति के लिए आसान और उपयोगी था।


1
हां, क्योंकि कुकीज होस्ट / डोमेन नाम से जुड़ी होती हैं, इसलिए इसके localhostसाथ साझा नहीं किया जा सकता 127.0.0.1और इसके विपरीत एक कुकी । लेकिन एक ही मेजबान / डोमेन पर कुकीज़, बंदरगाह की परवाह किए बिना, पहनने योग्य हैं।
रेमी लेबेउ

3
बेशक वे करते हैं। मैं (और शायद मिलियन अन्य डेवलपर्स) हर समय परीक्षण के लिए लोकलहोस्ट का उपयोग करते हैं। जब तक जोड़ा पोर्ट अंतर नहीं करता है: लोकलहोस्ट: 8080
डेविड बालैसिक

53
इसके अलावा, आप 127.0.0.1, 127.0.0.2, 127.0.0.3 आदि का उपयोग कर सकते हैं ... इन सभी का मतलब है लोकलहोस्ट।
डेविड बालिक

3
मैं इसे बढ़ा नहीं सकता क्योंकि यह सवाल का जवाब नहीं देता है, लेकिन यह एक महान टिप है, धन्यवाद!
मार्टिन टी।

2
यदि आप अपनी होस्ट फ़ाइल (/ आदि / यूनिक्स पर होस्ट) को संपादित करने के लिए तैयार हैं, तो आपके पास स्थानीयहोस्ट के रूप में कई सार्थक नाम हो सकते हैं।
सिलास एस। ब्राउन

20

यह कुकी SOP (समान उत्पत्ति नीति) में एक बड़ा ग्रे क्षेत्र है।

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

बेहतर तरीका यह है कि एक ही आईपी के लिए 2 डोमेन नाम प्राप्त करें और कुकीज़ के लिए पोर्ट नंबर पर निर्भर न रहें।


9
यह अब एक ग्रे क्षेत्र नहीं है। RFC 6265 , जो वर्तमान कुकी मानक है, विभिन्न बंदरगाहों का उपयोग करके एक ही मेजबान पर कुकीज़ को अलग करने की क्षमता को समाप्त करके इसके बारे में किसी भी भ्रम को समाप्त करता है।
रेमी लेबेउ

18

समस्या के चारों ओर जाने का एक वैकल्पिक तरीका है, सत्र कुकी का नाम पोर्ट संबंधी हो। उदाहरण के लिए:

  • पोर्ट 8080 पर चल रहे सर्वर के लिए mysession8080
  • पोर्ट 8000 पर चल रहे सर्वर के लिए mysession8000

आपका कोड यह पता लगाने के लिए वेबसर्वर कॉन्फ़िगरेशन का उपयोग कर सकता है कि आपका सर्वर किस पोर्ट का उपयोग करता है, और तदनुसार कुकी का नाम दें।

ध्यान रखें कि आपके आवेदन को दोनों कुकीज़ प्राप्त होंगी, और आपको अपने पोर्ट से मेल खाने वाले से अनुरोध करने की आवश्यकता है।

कुकी नाम में सटीक पोर्ट संख्या होने की आवश्यकता नहीं है, लेकिन यह अधिक सुविधाजनक है।

सामान्य तौर पर, कुकी नाम आपके द्वारा उपयोग किए जाने वाले सर्वर उदाहरण के लिए विशिष्ट किसी अन्य पैरामीटर को एन्कोड कर सकता है, इसलिए इसे सही संदर्भ द्वारा डिकोड किया जा सकता है।


9

IE 8 में, कुकीज़ (केवल स्थानीयहोस्ट के खिलाफ सत्यापित) बंदरगाहों के बीच साझा की जाती हैं। FF 10 में, वे नहीं हैं।

मैंने यह उत्तर पोस्ट किया है ताकि पाठकों के पास प्रत्येक परिदृश्य के परीक्षण के लिए कम से कम एक ठोस विकल्प हो।


4

मैं एक समान समस्या का सामना कर रहा था (और डिबग करने की कोशिश कर रहा था) एक ही मशीन पर दो अलग-अलग Django एप्लिकेशन।

मैं उन्हें इन आदेशों के साथ चला रहा था:

./manage.py runserver 8000
./manage.py runserver 8001

जब मैंने पहले एक में लॉगिन किया था और फिर दूसरे एक में मैंने हमेशा पहले वाले और उपाध्यक्ष को लॉग आउट किया था।

मैंने इसे अपने / आदि / मेजबानों पर जोड़ा

127.0.0.1    app1
127.0.0.1    app2

फिर मैंने इन कमांड के साथ दो ऐप शुरू किए:

./manage.py runserver app1:8000
./manage.py runserver app2:8001

समस्या सुलझ गयी :)


4
आप शायद का उपयोग कर सकते 127.0.0.1:8000हैं, एक के लिए localhost:8000एक पल के लिए, और संभवतः ::1:8000(शायद [::1]:8080कभी मेजबान फ़ाइल स्पर्श किए बिना) एक तिहाई के लिए।
ट्रैविस वाटसन

1
आप इसे एक पंक्ति में रख सकते हैं:::1 app1 app2 app3 app4 app5 appN
एरोसॉन

0

यह वैकल्पिक है।

पोर्ट निर्दिष्ट किया जा सकता है इसलिए कुकीज़ विशिष्ट पोर्ट हो सकते हैं। यह आवश्यक नहीं है, वेब सर्वर / एप्लिकेशन को इसका ध्यान रखना चाहिए।

स्रोत: जर्मन विकिपीडिया लेख , RFC2109 , अध्याय 4.3.1


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