นโยบายต้นกำเนิดเดียวกัน
ในภาษาการเขียนโปรแกรมฝั่งไคลเอ็นต์ เช่น JavaScript และ ActionScript นโยบายที่มีต้นกำเนิดเดียวกันเป็นแนวคิดด้านความปลอดภัยที่สำคัญมาก ซึ่งมีความสำคัญอย่างยิ่งในการรับรองความปลอดภัยของข้อมูล นโยบายต้นกำเนิดเดียวกันกำหนดว่าสคริปต์ ข้ามโดเมน จะถูกแยกออกจากกัน สคริปต์ในโดเมนหนึ่งไม่สามารถเข้าถึงและดำเนินการคุณสมบัติและวิธีการส่วนใหญ่ของโดเมนอื่นได้ แล้วโดเมนเดียวกันคืออะไร และโดเมนอื่นคืออะไร? เมื่อสองโดเมนมีโปรโตคอลเดียวกัน (เช่น http) พอร์ตเดียวกัน (เช่น 80) และโฮสต์เดียวกัน (เช่น www.example.org) เราก็จะถือว่าเป็นโดเมนเดียวกันได้ ตัวอย่างเช่น http://www.example.org/index.html และ http://www.example.org/sub/index.html อยู่ในโดเมนเดียวกัน ในขณะที่ http://www.example.org, https ://www สองรายการใดๆ ของ .example.org, http://www.example.org:8080, http://sub.example.org จะถือเป็นโดเมนข้ามโดเมน นโยบายที่มีต้นกำเนิดเดียวกันควรจัดการกับสถานการณ์พิเศษบางอย่าง เช่น การจำกัดสิทธิ์การเข้าถึงสคริปต์ภายใต้โปรโตคอลไฟล์ ไฟล์ HTML ในเครื่องถูกเปิดในเบราว์เซอร์ผ่านโปรโตคอลไฟล์ หากสคริปต์สามารถเข้าถึงไฟล์อื่น ๆ บนฮาร์ดดิสก์ผ่านโปรโตคอลไฟล์ ความเสี่ยงด้านความปลอดภัยก็จะเกิดขึ้น ในปัจจุบัน IE8 ยังคงมีความเสี่ยงดังกล่าว
ได้รับผลกระทบจากนโยบายต้นทางเดียวกัน การแชร์ ทรัพยากรข้ามโดเมนจะถูกจำกัด อย่างไรก็ตาม ด้วยการปฏิบัติของผู้คนและความก้าวหน้าของเบราว์เซอร์ ปัจจุบันมีประสบการณ์อันมีค่ามากมายที่สั่งสมและสะสมในทักษะการร้องขอข้ามโดเมน ในที่นี้ ฉันแบ่งการแบ่งปันทรัพยากรข้ามโดเมนออกเป็นสองประเภท ประเภทหนึ่งเป็นการร้องขอข้อมูลทางเดียว และอีกประเภทหนึ่งคือการสื่อสารด้วยข้อความสองทาง ต่อไป ฉันจะแสดงรายการวิธีการข้ามโดเมนทั่วไปบางอย่าง สามารถ รับซอร์สโค้ดของตัวอย่างข้ามโดเมนต่อไปนี้ได้ที่นี่
ข้ามโดเมนทางเดียว
เจสันพี
JSONP (JSON with Padding) เป็นวิธีการข้ามโดเมนที่เรียบง่ายและมีประสิทธิภาพ แท็กสคริปต์ใน HTML สามารถโหลดและเรียกใช้ JavaScript จากโดเมนอื่นได้ ดังนั้นเราจึงสามารถโหลดทรัพยากรจากโดเมนอื่นแบบไดนามิกผ่านแท็กสคริปต์ได้ ตัวอย่างเช่น หากฉันต้องการโหลดข้อมูลของโดเมน B จากหน้า pageA ของโดเมน A จากนั้นในหน้า pageB ของโดเมน B ฉันจะประกาศข้อมูลที่ pageA ต้องการในรูปแบบของ JavaScript จากนั้นใช้แท็กสคริปต์ใน pageA เพื่อโหลด pageB จากนั้นใน pageB สคริปต์จะถูกดำเนินการ JSONP เพิ่มฟังก์ชันการเรียกกลับบนพื้นฐานนี้ หลังจากโหลด pageB แล้ว ฟังก์ชันที่กำหนดไว้ใน pageA จะถูกดำเนินการ และข้อมูลที่ต้องการจะถูกส่งไปยังฟังก์ชันในรูปแบบของพารามิเตอร์ JSONP ใช้งานง่าย แต่ก็มีความเสี่ยงด้านความปลอดภัยอยู่บ้าง หากสคริปต์ของบุคคลที่สามได้รับการดำเนินการตามต้องการ สคริปต์ดังกล่าวอาจรบกวนเนื้อหาของหน้าและสกัดกั้นข้อมูลที่ละเอียดอ่อนได้ แต่เมื่อถ่ายโอนข้อมูลระหว่างฝ่ายที่เชื่อถือได้ JSONP เป็นตัวเลือกที่เหมาะสมมาก
แฟลช URLLoader
Flash มีชุดนโยบายความปลอดภัยของตัวเอง เซิร์ฟเวอร์สามารถใช้ไฟล์ crossdomain.xml เพื่อประกาศว่าไฟล์ SWF ของโดเมนใดที่สามารถเข้าถึงได้ เมื่อเข้าถึงทรัพยากรข้ามโดเมน เช่น การขอข้อมูลบนโดเมน www.b.com จากโดเมน www.a.com เราสามารถใช้ Flash เพื่อส่งคำขอ HTTP ขั้นแรก แก้ไข crossdomain.xml บนโดเมน www.b.com (โดยปกติจะจัดเก็บไว้ในไดเรกทอรีราก หากไม่จำเป็นต้องสร้างด้วยตนเอง) ให้เพิ่ม www.a.com ลงในรายการที่อนุญาต ประการที่สอง คำขอ HTTP จะถูกส่งผ่าน Flash URLLoader และสุดท้าย ผลการตอบสนองจะถูกส่งผ่านไปยัง JavaScript ผ่านทาง Flash API Flash URLLoader เป็นโซลูชันข้ามโดเมนที่ใช้กันทั่วไป แต่หากจำเป็นต้องรองรับ iOS โซลูชันนี้จะไม่สามารถทำอะไรได้เลย
การควบคุมการเข้าถึง
การควบคุมการเข้าถึงเป็นวิธีการข้ามโดเมนที่เหนือกว่า ปัจจุบันมีการสนับสนุนในเบราว์เซอร์บางตัวเท่านั้น เบราว์เซอร์เหล่านี้สามารถส่งคำขอ HTTP ข้ามโดเมนได้ (Firefox, Google Chrome ฯลฯ ใช้งานผ่าน XMLHTTPRequest และ IE8 ใช้งานผ่าน XDomainRequest ) การตอบสนองต่อคำขอจะต้องมีส่วนหัวการตอบสนอง HTTP ของ Access-Control-Allow-Origin ซึ่งประกาศการเข้าถึงของโดเมนที่ร้องขอ ตัวอย่างเช่น www.a.com ส่งคำขอ HTTP ข้ามโดเมนไปที่ Asset.php ภายใต้ www.b.com จากนั้น Asset.php จะต้องเพิ่มส่วนหัวการตอบกลับต่อไปนี้:
ส่วนหัว ("Access-Control-Allow-Origin: http://www.a.com");