ส่วนหัวของ Access-Control-Allow-Credentials ทำอะไรกันแน่?


167

ฉันพยายามที่จะเข้าใจวิธีการใช้ CORS และสับสนเกี่ยวกับสิ่งที่Access-Control-Allow-Credentialsส่วนหัวทำ

เอกสารกล่าวว่า

ระบุว่าการตอบกลับคำขอสามารถถูกเปิดเผยได้หรือไม่เมื่อการตั้งค่าสถานะหนังสือรับรองเป็นจริง

แต่ฉันไม่เข้าใจความหมายของคำตอบที่ "เปิดเผย"

ทุกคนสามารถอธิบายว่าส่วนหัวนี้ถูกตั้งค่าเป็นจริง (ร่วมกับการตั้งค่าข้อมูลประจำตัวการตั้งค่าเป็นจริง) จริงหรือไม่


xhr.withCredential doc ที่ฝั่งไคลเอนต์developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/…
Weishi Zeng

คำตอบ:


265

ตามค่าเริ่มต้น CORS จะไม่รวมคุกกี้ในคำขอข้ามทาง สิ่งนี้แตกต่างจากเทคนิคการข้ามจุดกำเนิดอื่น ๆ เช่น JSON-P JSON-P มักจะรวมถึงคุกกี้ที่มีการร้องขอและพฤติกรรมนี้สามารถนำไปสู่คลาสของช่องโหว่ที่เรียกว่าการปลอมแปลงคำขอข้ามไซต์หรือ CSRF

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

รหัสลูกค้าจะต้องกำหนดwithCredentialsคุณสมบัติในXMLHttpRequestการtrueเพื่อที่จะให้ได้รับอนุญาต

อย่างไรก็ตามส่วนหัวนี้เพียงอย่างเดียวไม่เพียงพอ เซิร์ฟเวอร์ต้องตอบกลับด้วยAccess-Control-Allow-Credentialsส่วนหัว การตอบสนองด้วยส่วนหัวนี้trueหมายความว่าเซิร์ฟเวอร์อนุญาตให้รวมคุกกี้ (หรือข้อมูลรับรองผู้ใช้อื่น ๆ ) ไว้ในคำขอข้ามทาง

คุณต้องตรวจสอบให้แน่ใจว่าเบราว์เซอร์ของคุณไม่ได้บล็อกคุกกี้ของบุคคลที่สามหากคุณต้องการให้มีการขอหนังสือรับรองจากต้นทาง

โปรดทราบว่าไม่ว่าคุณจะทำคำขอต้นทางหรือข้ามหน้าที่เดียวกันคุณต้องปกป้องไซต์ของคุณจาก CSRF (โดยเฉพาะถ้าคำขอของคุณมีคุกกี้)


1
ฉันชี้แจงคำตอบให้ครอบคลุมคำถามของคุณ โดยทั่วไป JSON-P ทำผิดและปลอดภัยน้อยกว่า
monsur

28
เพียงต้องการเพิ่มความเห็นเกี่ยวกับความหมายของ "ที่เปิดเผย" ข้อมูลจำเพาะไม่จำเป็นต้องมีเที่ยวบินล่วงหน้า (ไปกลับเพิ่มเติมเพื่อตรวจสอบว่าเซิร์ฟเวอร์จะอนุญาตให้ใช้ข้อมูลรับรอง) สำหรับคำขอ GET หรือไม่ แทนที่จะทำการ preflighting เบราว์เซอร์จะทำการร้องขอส่งคุกกี้หากwithCredentialsมีการตั้งค่าเสมอ แต่เมื่อได้รับการตอบสนองหากมีการตั้งค่าแบบดั้งเดิมมันจะส่ง / เปิดเผยผลลัพธ์ไปยังจาวาสคริปต์หากการตอบสนองมีการเข้าถึง ชุดควบคุมส่วนหัวของหนังสือรับรอง หากไม่มีส่วนหัวก็จะไม่แสดงการตอบสนองอย่างมีประสิทธิภาพ black-holing
heavi5ide

4
@ heavyi5 ด้านใช่ถึงแม้ว่าเบราว์เซอร์จะไม่เปิดเผยการตอบสนองต่อรหัสไคลเอนต์การร้องขอพร้อมคุกกี้ก็ยังคงส่ง (สำหรับคำขอที่ไม่ได้เตรียมการล่วงหน้า) ดังนั้น CSRF จะยังคงทำอยู่
Pacerier

7
เนื่องจากนี่เป็นคำตอบที่ได้รับความนิยมฉันจะเพิ่มข้อมูลที่สำคัญอีกหนึ่งชิ้น: นอกเหนือจากการกำหนดค่าคำขอและส่วนหัวการตอบกลับอย่างถูกต้องคุณต้องแน่ใจว่าเบราว์เซอร์ของคุณไม่บล็อกคุกกี้ของบุคคลที่สามด้วย ต้องการคำขอที่มีหนังสือรับรองข้ามที่ทำงาน ดูstackoverflow.com/a/16634887/2970321
alexw

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