ไทย

วิดีโอและคำบรรยาย · ตัวดาวน์โหลดสื่อโดยตรง

ประวัติโดยย่อของนโยบายต้นกำเนิดเดียวกันและ CORS ในเว็บเบราว์เซอร์

· พื้นหลัง

cors ประวัติเว็บ ความปลอดภัย

ต้นกำเนิดของเบราว์เซอร์ในยุคแรกๆ พัฒนาไปสู่การเข้าถึงแบบข้ามต้นทางที่มีการควบคุม HTTP
ภาพประกอบเวกเตอร์ต้นฉบับ ToolAcre

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

เหตุใดเบราว์เซอร์ปฏิเสธที่จะมอบไบต์ที่เพิ่งได้รับให้กับแท็บของคุณเอง ซึ่งเป็นผลกระทบในชีวิตประจำวันของกฎที่มีอายุหลายสิบปี

เบราว์เซอร์สามารถแสดงไฟล์ระยะไกลได้ แต่ปฏิเสธที่จะให้เนื้อหาการตอบกลับนั้นไปที่หน้า JavaScript ข้อขัดแย้งที่ชัดเจนคือการแยกความปลอดภัยระหว่างการนำทางและการอ่านข้ามต้นทางทางโปรแกรม

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

Netscape, JavaScript และกฎต้นกำเนิดแรก — ปัญหาด้านความปลอดภัยที่แจ้งนโยบายต้นกำเนิดเดียวกัน

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

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

XMLHttpRequest และเว็บที่ปิดล้อม — คำขอแบบสคริปต์สืบทอดกฎอย่างไร และเหตุใดการผสานรวมจึงประสบปัญหา

XMLHttpRequest ที่เปิดใช้งานพื้นหลัง HTTP ใช้งานได้ แต่ยังคงข้อจำกัดของแหล่งกำเนิดไว้ นั่นทำให้แอปพลิเคชันไซต์เดียวกันมีประโยชน์ ในขณะที่การผสมข้ามไซต์จำเป็นต้องอาศัยความร่วมมือหรือตัวกลางเซิร์ฟเวอร์

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

มาตรฐาน CORS — วิธีที่ส่วนหัวของ Access-Control อนุญาตให้เซิร์ฟเวอร์เลือกใช้การอ่านแบบข้ามต้นทางโดยไม่สูญเสียค่าเริ่มต้น

CORS จัดหาความร่วมมือผ่านส่วนหัวการตอบกลับ HTTP ที่ตีความโดยเบราว์เซอร์ `Access-Control-Allow-Origin` สามารถให้สิทธิ์แก่ต้นทางที่ร้องขอ หรือในกรณีที่เหมาะสมที่ไม่ต้องใช้ข้อมูลรับรอง จะให้สิทธิ์แก่ผู้ชมในวงกว้างขึ้น

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

เที่ยวบินล่วงหน้า คำของ่ายๆ และการตอบกลับที่ไม่ชัดเจน — คำศัพท์ที่อธิบายความล้มเหลวในการดาวน์โหลดส่วนใหญ่

คำขอข้ามต้นทางบางคำขอนั้นง่ายพอที่จะไม่ต้องมีการตรวจสอบล่วงหน้า ขั้นแรกให้ผู้อื่นส่ง OPTIONS เพื่อถามว่าอนุญาตให้ใช้วิธีและส่วนหัวหรือไม่ พรีไฟลท์คือการเจรจา ไม่ใช่การถ่ายโอนสื่อจริง

การตอบสนองแบบทึบเกิดขึ้นจากโหมดไม่มีคอร์และซ่อนสถานะ ส่วนหัว และเนื้อหาจากสคริปต์ ToolAcre ไม่ได้เลือกโหมดนั้นเนื่องจากเนื้อหาที่อ่านไม่ได้ไม่สามารถกลายเป็น Blob ที่สามารถบันทึกได้ ข้อผิดพลาด CORS อาจอยู่ร่วมกับคำขอฝั่งเซิร์ฟเวอร์ที่ประสบความสำเร็จ ซึ่งตอกย้ำว่าเหตุใดความล้มเหลวของแอปพลิเคชันไม่ได้หมายความว่าต้นทางไม่ได้รับอะไรเลย การตัดสินใจก่อนการบินที่แคชไว้สามารถเปลี่ยนแปลงสิ่งที่ปรากฏในการติดตามที่อบอุ่นได้ ดังนั้นการไม่มี OPTIONS ในอดีตจึงไม่ใช่ข้อพิสูจน์ว่าไม่เคยมีการเจรจาเกิดขึ้น

CORS มีความหมายต่อตัวดาวน์โหลดเฉพาะเบราว์เซอร์อย่างไร — โฮสต์เป็นผู้ตัดสินใจ เครื่องมือไม่สามารถแทนที่ได้ และความซื่อสัตย์เกี่ยวกับสิ่งนั้นคือคำตอบที่ถูกต้อง

สำหรับโปรแกรมดาวน์โหลดนี้ โฮสต์จะตัดสินใจว่าการตอบกลับ HEAD และ GET สามารถอ่านได้หรือไม่ ToolAcre ไม่สามารถแนบส่วนหัวการตอบกลับที่อนุญาตแหล่งกำเนิดในนามของโฮสต์ และจะไม่ถ่ายทอดเนื้อหาผ่านต้นกำเนิดของตัวเอง

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

Takeaway: กฎที่ปกป้องคุณแม้ว่าจะทำให้คุณรำคาญ — วิธีการทำงานของ Direct Media Downloader ภายในนั้นแทนที่จะทำงานรอบๆ

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

Direct Media Downloader ทำงานภายในโมเดลนั้น: ตรวจสอบภายในเครื่อง ขออย่างเปิดเผย อธิบายการปฏิเสธ และแนะนำการบันทึกแบบเนทิฟตามความเหมาะสม มันไม่ได้เปลี่ยนขอบเขตความปลอดภัยของเบราว์เซอร์ให้เป็นปัญหาบายพาส การทำความเข้าใจว่าประวัติดังกล่าวเปลี่ยนข้อผิดพลาดจากความเป็นปรปักษ์ของเบราว์เซอร์โดยพลการเป็นผลที่มองเห็นได้จากรูปแบบการอ่านข้ามไซต์ที่ถูกปฏิเสธโดยค่าเริ่มต้น เจ้าของต้นทางควรทดสอบส่วนหัวการผลิตที่แน่นอนสำหรับวิธีการที่ต้องการ แทนที่จะอาศัยการกำหนดค่าแดชบอร์ดเพียงอย่างเดียว