พอร์ต HTTP ของคุกกี้นั้นเฉพาะเจาะจงหรือไม่


355

ฉันมีบริการ HTTP สองบริการที่ทำงานในเครื่องเดียว ฉันแค่อยากรู้ว่าพวกเขาแบ่งปันคุกกี้หรือไม่หรือเบราว์เซอร์แยกความแตกต่างระหว่างซ็อกเก็ตเซิร์ฟเวอร์ทั้งสองหรือไม่

คำตอบ:


329

ข้อกำหนดคุกกี้ปัจจุบันคือRFC 6265ซึ่งแทนที่RFC 2109และRFC 2965 (ตอนนี้ RFC ทั้งสองถูกทำเครื่องหมายเป็น "ประวัติศาสตร์") และทำให้ไวยากรณ์ของคุกกี้ในโลกแห่งความเป็นจริงเป็นทางการ ชัดเจนว่า:

  1. บทนำ

...

ด้วยเหตุผลทางประวัติศาสตร์คุกกี้มีความปลอดภัยและความเป็นส่วนตัวจำนวนมาก ตัวอย่างเช่นเซิร์ฟเวอร์สามารถระบุว่าคุกกี้ที่กำหนดมีไว้สำหรับการเชื่อมต่อ "ปลอดภัย" แต่แอตทริบิวต์ Secure ไม่ได้ให้ความสมบูรณ์ในการปรากฏตัวของผู้โจมตีเครือข่ายที่ใช้งานอยู่ ในทำนองเดียวกันคุกกี้สำหรับโฮสต์ที่กำหนดจะถูกแชร์ข้ามพอร์ตทั้งหมดบนโฮสต์นั้นแม้ว่าเว็บเบราว์เซอร์จะใช้ "นโยบายต้นกำเนิดเดียวกัน" ตามปกติซึ่งแยกเนื้อหาที่ดึงออกมาผ่านพอร์ตต่าง ๆ

และนอกจากนี้ยังมี:

8.5 ความลับอ่อนแอ

คุกกี้ไม่ให้แยกจากพอร์ต หากคุกกี้สามารถอ่านได้โดยบริการที่ทำงานบนพอร์ตหนึ่งคุกกี้นั้นยังสามารถอ่านได้โดยบริการที่ทำงานบนพอร์ตอื่นของเซิร์ฟเวอร์เดียวกัน หากคุกกี้สามารถเขียนได้โดยบริการในพอร์ตหนึ่งคุกกี้นั้นยังสามารถเขียนได้โดยบริการที่ทำงานบนพอร์ตอื่นของเซิร์ฟเวอร์เดียวกัน ด้วยเหตุนี้เซิร์ฟเวอร์จึงไม่ควรเรียกใช้บริการที่ไม่น่าไว้วางใจร่วมกันบนพอร์ตต่างๆของโฮสต์เดียวกันและใช้คุกกี้เพื่อเก็บข้อมูลที่สำคัญด้านความปลอดภัย


129

อ้างอิงจากRFC2965 3.3.1 (ซึ่งอาจหรือไม่อาจตามมาด้วยเบราว์เซอร์) เว้นแต่ว่ามีการระบุพอร์ตอย่างชัดเจนผ่านportพารามิเตอร์ของSet-Cookieส่วนหัวคุกกี้อาจหรือไม่อาจส่งไปยังพอร์ตใดก็ได้

คู่มือรักษาความปลอดภัยเบราว์เซอร์ของ Google กล่าวว่า: โดยค่าเริ่มต้นขอบเขตคุกกี้จะถูก จำกัด เฉพาะ URL ทั้งหมดในชื่อโฮสต์ปัจจุบัน - และไม่ผูกกับพอร์ตหรือข้อมูลโปรโตคอล และบางบรรทัดในภายหลังไม่มีวิธี จำกัด คุกกี้เป็นชื่อ DNS เดียวเท่านั้น [... ] ในทำนองเดียวกันไม่มีวิธี จำกัด คุกกี้ไว้ที่พอร์ตเฉพาะ (นอกจากนี้ยังเก็บไว้ในใจว่า IE ไม่หมายเลขพอร์ตไม่ได้เป็นปัจจัยลงในนโยบายเดียวกันที่มาของการที่ทุกคน .)

ดังนั้นจึงดูเหมือนจะไม่ปลอดภัยที่จะพึ่งพาพฤติกรรมที่กำหนดไว้อย่างดีที่นี่


75
RFC 6265ซึ่งแทนที่ RFC 2965 จะกำจัดPortพารามิเตอร์ในSet-Cookieส่วนหัว (เพราะแทบจะไม่มีใครใช้จริง ๆ ในทางปฏิบัติ) และทำให้ชัดเจนว่าคุกกี้บนโฮสต์เดียวกันไม่ได้ถูกทำลายโดยพอร์ตอีกต่อไป
Remy Lebeau

5
IE 9 จะไม่ส่งคุกกี้กลับมาตามคำขอในภายหลังหากโดเมนมีพอร์ตอยู่ในนั้น
axk

3
มีเบราว์เซอร์ใดบ้างที่ยังคงพิจารณาพอร์ตใน SOP ของคุกกี้
Bertuz

5
Chrome จะไม่ตั้งค่าคุกกี้หากมีโดเมนที่มีพอร์ตอยู่
Pim Heijden

76

นี่เป็นคำถามที่เก่ามาก แต่ฉันคิดว่าฉันจะเพิ่มวิธีแก้ปัญหาที่ฉันใช้

ฉันมีสองบริการที่ทำงานอยู่บนแล็ปท็อปของฉัน (หนึ่งที่พอร์ต 3000 และอีกอันใน 4000) เมื่อฉันจะข้ามไปมาระหว่าง ( http://localhost:3000และhttp://localhost:4000), Chrome จะผ่านในคุกกี้เดียวกันแต่ละบริการจะไม่เข้าใจคุกกี้และสร้างใหม่

ฉันพบว่าถ้าฉันเข้าถึงhttp://localhost:3000และhttp://127.0.0.1:4000ปัญหาได้หายไปตั้งแต่ Chrome เก็บคุกกี้ไว้สำหรับโฮสต์ในพื้นที่และอีกอันสำหรับ 127.0.0.1

อีกครั้งไม่มีใครสนใจตอนนี้ แต่มันง่ายและเป็นประโยชน์กับสถานการณ์ของฉัน


1
ใช่เพราะคุกกี้เชื่อมโยงกับชื่อโฮสต์ / โดเมนดังนั้นคุกกี้ในlocalhostจึงไม่สามารถแชร์กับ127.0.0.1และในทางกลับกัน แต่คุกกี้บนโฮสต์ / โดเมนเดียวกันโดยไม่คำนึงถึงพอร์ตนั้นสามารถแชร์ได้
Remy Lebeau

3
แน่นอนพวกเขาทำ ฉัน (และอาจเป็นนักพัฒนารายอื่น ๆ ล้านคน) ใช้ localhost สำหรับการทดสอบตลอดเวลา เว้นแต่ว่าพอร์ตที่เพิ่มเข้ามานั้นสร้างความแตกต่าง: localhost: 8080
David Balažic

53
นอกจากนี้คุณสามารถใช้ 127.0.0.1, 127.0.0.2, 127.0.0.3 และอื่น ๆ ... พวกมันทั้งหมดหมายถึง localhost
David Balažic

3
ฉันไม่สามารถโหวตได้เพราะไม่ตอบคำถาม แต่เป็นเคล็ดลับที่ยอดเยี่ยมขอบคุณ!
Martin T.

2
หากคุณยินดีที่จะแก้ไขไฟล์ hosts (/ etc / hosts บน Unix) คุณสามารถมีชื่อที่มีความหมายได้มากเท่าที่คุณต้องการสำหรับ localhost
สิลาสเอส. บราวน์

20

นี่เป็นพื้นที่สีเทาขนาดใหญ่ในคุกกี้ SOP (นโยบายกำเนิดเดียวกัน)

ตามหลักวิชาคุณสามารถระบุหมายเลขพอร์ตในโดเมนและคุกกี้จะไม่ถูกแชร์ ในทางปฏิบัติสิ่งนี้ใช้ไม่ได้กับเบราว์เซอร์หลายตัวและคุณจะพบปัญหาอื่น ๆ ดังนั้นนี่เป็นไปได้เฉพาะในกรณีที่ไซต์ของคุณไม่ได้เปิดสำหรับบุคคลทั่วไปและคุณสามารถควบคุมเบราว์เซอร์ที่จะใช้

วิธีที่ดีกว่าคือการได้รับ 2 ชื่อโดเมนสำหรับ IP เดียวกันและไม่ใช้หมายเลขพอร์ตสำหรับคุกกี้


9
ไม่ใช่พื้นที่สีเทาอีกต่อไป RFC 6265ซึ่งเป็นมาตรฐานคุกกี้ปัจจุบันกำจัดความสับสนใด ๆ เกี่ยวกับมันโดยเพียงแค่กำจัดความสามารถในการแยกคุกกี้บนโฮสต์เดียวกันโดยใช้พอร์ตที่แตกต่างกัน
Remy Lebeau

18

อีกทางเลือกหนึ่งในการแก้ไขปัญหาคือทำให้ชื่อของคุกกี้เซสชันนั้นเกี่ยวข้องกับพอร์ต ตัวอย่างเช่น:

  • mysession8080สำหรับเซิร์ฟเวอร์ที่ทำงานบนพอร์ต 8080
  • mysession8000สำหรับเซิร์ฟเวอร์ที่ทำงานบนพอร์ต 8000

รหัสของคุณสามารถเข้าถึงการกำหนดค่าเว็บเซิร์ฟเวอร์เพื่อค้นหาพอร์ตที่เซิร์ฟเวอร์ของคุณใช้และตั้งชื่อคุกกี้ตามนั้น

โปรดทราบว่าแอปพลิเคชันของคุณจะได้รับคุกกี้ทั้งสองและคุณจำเป็นต้องขอคุกกี้ที่สอดคล้องกับพอร์ตของคุณ

ไม่จำเป็นต้องมีหมายเลขพอร์ตที่แน่นอนในชื่อคุกกี้ แต่สะดวกกว่า

โดยทั่วไปชื่อคุกกี้สามารถเข้ารหัสพารามิเตอร์อื่น ๆ ที่เฉพาะเจาะจงกับอินสแตนซ์เซิร์ฟเวอร์ที่คุณใช้เพื่อให้สามารถถอดรหัสโดยบริบทที่เหมาะสม


9

ใน IE 8 คุกกี้ (ตรวจสอบกับ localhost เท่านั้น) จะถูกแชร์ระหว่างพอร์ต ใน FF 10 พวกเขาไม่ใช่

ฉันโพสต์คำตอบนี้เพื่อให้ผู้อ่านมีตัวเลือกที่เป็นรูปธรรมสำหรับการทดสอบในแต่ละสถานการณ์


4

ฉันกำลังประสบปัญหาคล้ายกันในการทำงาน (และพยายามที่จะแก้ปัญหา) สองแอปพลิเคชั่น 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

แก้ไขปัญหา :)


4
คุณอาจจะสามารถใช้127.0.0.1:8000สำหรับหนึ่งlocalhost:8000สำหรับวินาทีและอาจ::1:8000(อาจ[::1]:8080) สำหรับหนึ่งในสามโดยไม่ต้องสัมผัสไฟล์โฮสต์
เทรวิสวัตสัน

1
คุณสามารถใส่มันเข้าไปในหนึ่งบรรทัด:::1 app1 app2 app3 app4 app5 appN
ละอองลอย

0

มันเป็นตัวเลือก

พอร์ตอาจถูกระบุเพื่อให้คุกกี้สามารถระบุพอร์ตได้ ไม่จำเป็นต้องมีเว็บเซิร์ฟเวอร์ / แอปพลิเคชันที่ต้องดูแลสิ่งนี้

แหล่งที่มา: บทความ Wikipedia ภาษาเยอรมัน , RFC2109 , บทที่ 4.3.1


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.