ฉันมีบริการ HTTP สองบริการที่ทำงานในเครื่องเดียว ฉันแค่อยากรู้ว่าพวกเขาแบ่งปันคุกกี้หรือไม่หรือเบราว์เซอร์แยกความแตกต่างระหว่างซ็อกเก็ตเซิร์ฟเวอร์ทั้งสองหรือไม่
ฉันมีบริการ HTTP สองบริการที่ทำงานในเครื่องเดียว ฉันแค่อยากรู้ว่าพวกเขาแบ่งปันคุกกี้หรือไม่หรือเบราว์เซอร์แยกความแตกต่างระหว่างซ็อกเก็ตเซิร์ฟเวอร์ทั้งสองหรือไม่
คำตอบ:
ข้อกำหนดคุกกี้ปัจจุบันคือRFC 6265ซึ่งแทนที่RFC 2109และRFC 2965 (ตอนนี้ RFC ทั้งสองถูกทำเครื่องหมายเป็น "ประวัติศาสตร์") และทำให้ไวยากรณ์ของคุกกี้ในโลกแห่งความเป็นจริงเป็นทางการ ชัดเจนว่า:
- บทนำ
...
ด้วยเหตุผลทางประวัติศาสตร์คุกกี้มีความปลอดภัยและความเป็นส่วนตัวจำนวนมาก ตัวอย่างเช่นเซิร์ฟเวอร์สามารถระบุว่าคุกกี้ที่กำหนดมีไว้สำหรับการเชื่อมต่อ "ปลอดภัย" แต่แอตทริบิวต์ Secure ไม่ได้ให้ความสมบูรณ์ในการปรากฏตัวของผู้โจมตีเครือข่ายที่ใช้งานอยู่ ในทำนองเดียวกันคุกกี้สำหรับโฮสต์ที่กำหนดจะถูกแชร์ข้ามพอร์ตทั้งหมดบนโฮสต์นั้นแม้ว่าเว็บเบราว์เซอร์จะใช้ "นโยบายต้นกำเนิดเดียวกัน" ตามปกติซึ่งแยกเนื้อหาที่ดึงออกมาผ่านพอร์ตต่าง ๆ
และนอกจากนี้ยังมี:
8.5 ความลับอ่อนแอ
คุกกี้ไม่ให้แยกจากพอร์ต หากคุกกี้สามารถอ่านได้โดยบริการที่ทำงานบนพอร์ตหนึ่งคุกกี้นั้นยังสามารถอ่านได้โดยบริการที่ทำงานบนพอร์ตอื่นของเซิร์ฟเวอร์เดียวกัน หากคุกกี้สามารถเขียนได้โดยบริการในพอร์ตหนึ่งคุกกี้นั้นยังสามารถเขียนได้โดยบริการที่ทำงานบนพอร์ตอื่นของเซิร์ฟเวอร์เดียวกัน ด้วยเหตุนี้เซิร์ฟเวอร์จึงไม่ควรเรียกใช้บริการที่ไม่น่าไว้วางใจร่วมกันบนพอร์ตต่างๆของโฮสต์เดียวกันและใช้คุกกี้เพื่อเก็บข้อมูลที่สำคัญด้านความปลอดภัย
อ้างอิงจากRFC2965 3.3.1 (ซึ่งอาจหรือไม่อาจตามมาด้วยเบราว์เซอร์) เว้นแต่ว่ามีการระบุพอร์ตอย่างชัดเจนผ่านport
พารามิเตอร์ของSet-Cookie
ส่วนหัวคุกกี้อาจหรือไม่อาจส่งไปยังพอร์ตใดก็ได้
คู่มือรักษาความปลอดภัยเบราว์เซอร์ของ Google กล่าวว่า: โดยค่าเริ่มต้นขอบเขตคุกกี้จะถูก จำกัด เฉพาะ URL ทั้งหมดในชื่อโฮสต์ปัจจุบัน - และไม่ผูกกับพอร์ตหรือข้อมูลโปรโตคอล และบางบรรทัดในภายหลังไม่มีวิธี จำกัด คุกกี้เป็นชื่อ DNS เดียวเท่านั้น [... ] ในทำนองเดียวกันไม่มีวิธี จำกัด คุกกี้ไว้ที่พอร์ตเฉพาะ (นอกจากนี้ยังเก็บไว้ในใจว่า IE ไม่หมายเลขพอร์ตไม่ได้เป็นปัจจัยลงในนโยบายเดียวกันที่มาของการที่ทุกคน .)
ดังนั้นจึงดูเหมือนจะไม่ปลอดภัยที่จะพึ่งพาพฤติกรรมที่กำหนดไว้อย่างดีที่นี่
นี่เป็นคำถามที่เก่ามาก แต่ฉันคิดว่าฉันจะเพิ่มวิธีแก้ปัญหาที่ฉันใช้
ฉันมีสองบริการที่ทำงานอยู่บนแล็ปท็อปของฉัน (หนึ่งที่พอร์ต 3000 และอีกอันใน 4000) เมื่อฉันจะข้ามไปมาระหว่าง ( http://localhost:3000
และhttp://localhost:4000
), Chrome จะผ่านในคุกกี้เดียวกันแต่ละบริการจะไม่เข้าใจคุกกี้และสร้างใหม่
ฉันพบว่าถ้าฉันเข้าถึงhttp://localhost:3000
และhttp://127.0.0.1:4000
ปัญหาได้หายไปตั้งแต่ Chrome เก็บคุกกี้ไว้สำหรับโฮสต์ในพื้นที่และอีกอันสำหรับ 127.0.0.1
อีกครั้งไม่มีใครสนใจตอนนี้ แต่มันง่ายและเป็นประโยชน์กับสถานการณ์ของฉัน
localhost
จึงไม่สามารถแชร์กับ127.0.0.1
และในทางกลับกัน แต่คุกกี้บนโฮสต์ / โดเมนเดียวกันโดยไม่คำนึงถึงพอร์ตนั้นสามารถแชร์ได้
นี่เป็นพื้นที่สีเทาขนาดใหญ่ในคุกกี้ SOP (นโยบายกำเนิดเดียวกัน)
ตามหลักวิชาคุณสามารถระบุหมายเลขพอร์ตในโดเมนและคุกกี้จะไม่ถูกแชร์ ในทางปฏิบัติสิ่งนี้ใช้ไม่ได้กับเบราว์เซอร์หลายตัวและคุณจะพบปัญหาอื่น ๆ ดังนั้นนี่เป็นไปได้เฉพาะในกรณีที่ไซต์ของคุณไม่ได้เปิดสำหรับบุคคลทั่วไปและคุณสามารถควบคุมเบราว์เซอร์ที่จะใช้
วิธีที่ดีกว่าคือการได้รับ 2 ชื่อโดเมนสำหรับ IP เดียวกันและไม่ใช้หมายเลขพอร์ตสำหรับคุกกี้
อีกทางเลือกหนึ่งในการแก้ไขปัญหาคือทำให้ชื่อของคุกกี้เซสชันนั้นเกี่ยวข้องกับพอร์ต ตัวอย่างเช่น:
รหัสของคุณสามารถเข้าถึงการกำหนดค่าเว็บเซิร์ฟเวอร์เพื่อค้นหาพอร์ตที่เซิร์ฟเวอร์ของคุณใช้และตั้งชื่อคุกกี้ตามนั้น
โปรดทราบว่าแอปพลิเคชันของคุณจะได้รับคุกกี้ทั้งสองและคุณจำเป็นต้องขอคุกกี้ที่สอดคล้องกับพอร์ตของคุณ
ไม่จำเป็นต้องมีหมายเลขพอร์ตที่แน่นอนในชื่อคุกกี้ แต่สะดวกกว่า
โดยทั่วไปชื่อคุกกี้สามารถเข้ารหัสพารามิเตอร์อื่น ๆ ที่เฉพาะเจาะจงกับอินสแตนซ์เซิร์ฟเวอร์ที่คุณใช้เพื่อให้สามารถถอดรหัสโดยบริบทที่เหมาะสม
ใน IE 8 คุกกี้ (ตรวจสอบกับ localhost เท่านั้น) จะถูกแชร์ระหว่างพอร์ต ใน FF 10 พวกเขาไม่ใช่
ฉันโพสต์คำตอบนี้เพื่อให้ผู้อ่านมีตัวเลือกที่เป็นรูปธรรมสำหรับการทดสอบในแต่ละสถานการณ์
ฉันกำลังประสบปัญหาคล้ายกันในการทำงาน (และพยายามที่จะแก้ปัญหา) สองแอปพลิเคชั่น Django ที่แตกต่างกันในเครื่องเดียวกัน
ฉันใช้คำสั่งเหล่านี้:
./manage.py runserver 8000
./manage.py runserver 8001
เมื่อฉันเข้าสู่ระบบในครั้งแรกและจากนั้นในครั้งที่สองฉันมักจะออกจากระบบแรกและ viceversa
ฉันเพิ่มสิ่งนี้ใน/ etc / hostsของฉัน
127.0.0.1 app1
127.0.0.1 app2
จากนั้นฉันก็เริ่มแอพทั้งสองด้วยคำสั่งเหล่านี้:
./manage.py runserver app1:8000
./manage.py runserver app2:8001
แก้ไขปัญหา :)
127.0.0.1:8000
สำหรับหนึ่งlocalhost:8000
สำหรับวินาทีและอาจ::1:8000
(อาจ[::1]:8080
) สำหรับหนึ่งในสามโดยไม่ต้องสัมผัสไฟล์โฮสต์
::1 app1 app2 app3 app4 app5 appN
มันเป็นตัวเลือก
พอร์ตอาจถูกระบุเพื่อให้คุกกี้สามารถระบุพอร์ตได้ ไม่จำเป็นต้องมีเว็บเซิร์ฟเวอร์ / แอปพลิเคชันที่ต้องดูแลสิ่งนี้
แหล่งที่มา: บทความ Wikipedia ภาษาเยอรมัน , RFC2109 , บทที่ 4.3.1
Port
พารามิเตอร์ในSet-Cookie
ส่วนหัว (เพราะแทบจะไม่มีใครใช้จริง ๆ ในทางปฏิบัติ) และทำให้ชัดเจนว่าคุกกี้บนโฮสต์เดียวกันไม่ได้ถูกทำลายโดยพอร์ตอีกต่อไป