TLDR:ไม่มีอะไรหยุดโค้ดที่เป็นอันตรายจากการปลอมแปลงต้นทาง เมื่อเป็นเช่นนั้นเซิร์ฟเวอร์ของคุณจะไม่มีทางรู้เรื่องนี้และจะดำเนินการตามคำขอ บางครั้งคำขอเหล่านั้นมีราคาแพง ดังนั้นอย่าใช้ CORS แทนการรักษาความปลอดภัยทุกประเภท
เมื่อเร็ว ๆ นี้ฉันได้เล่นกับ CORS และฉันก็ถามตัวเองด้วยคำถามเดียวกัน สิ่งที่ฉันพบคือเบราว์เซอร์อาจฉลาดพอที่จะรู้คำขอ CORS ที่ปลอมแปลงเมื่อเห็น แต่เซิร์ฟเวอร์ของคุณไม่ฉลาดเท่า
สิ่งแรกที่ฉันพบคือOrigin
ส่วนหัวเป็นชื่อส่วนหัวที่ต้องห้ามของ HTTP ซึ่งไม่สามารถแก้ไขโดยใช้โปรแกรมได้ ซึ่งหมายความว่าคุณสามารถแก้ไขได้ในเวลาประมาณ 8 วินาทีโดยใช้การปรับเปลี่ยนส่วนหัวสำหรับ Google Chrome
เพื่อทดสอบสิ่งนี้ฉันตั้งค่าโดเมนไคลเอนต์สองโดเมนและโดเมนเซิร์ฟเวอร์หนึ่งโดเมน ฉันรวมรายการที่อนุญาตพิเศษของ CORS ไว้บนเซิร์ฟเวอร์ซึ่งอนุญาตให้มีการร้องขอ CORS จากไคลเอนต์ 1 แต่ไม่ใช่จากไคลเอนต์ 2 ฉันทดสอบไคลเอนต์ทั้งสองและแน่นอนว่าคำขอ CORS ของไคลเอ็นต์ 1 ประสบความสำเร็จในขณะที่ไคลเอนต์ 2 ล้มเหลว
จากนั้นฉันก็หลอกOrigin
ส่วนหัวของไคลเอนต์ 2 เพื่อให้ตรงกับไคลเอนต์ 1 เซิร์ฟเวอร์ได้รับOrigin
ส่วนหัวที่ปลอมแปลงและผ่านการตรวจสอบรายการที่อนุญาต (หรือล้มเหลวหากคุณเป็นผู้ชายที่ว่างเปล่าครึ่งแก้ว) หลังจากนั้นเซิร์ฟเวอร์ก็ดำเนินการตามหน้าที่โดยใช้ทรัพยากรทั้งหมดที่ออกแบบมาเพื่อใช้งาน (การโทรฐานข้อมูลการส่งอีเมลราคาแพงการส่งข้อความ SMS ที่มีราคาแพงกว่าเป็นต้น) เมื่อเสร็จแล้วเซิร์ฟเวอร์ก็ส่งAccess-Control-Allow-Origin
ส่วนหัวที่ปลอมแปลงกลับไปยังเบราว์เซอร์อย่างมีความสุข
เอกสารที่ฉันอ่านระบุว่าAccess-Control-Allow-Origin
ค่าที่ได้รับต้องตรงกับOrigin
ค่าที่ส่งในคำขอทุกประการ มันตรงกันดังนั้นฉันจึงแปลกใจเมื่อเห็นข้อความต่อไปนี้ใน Chrome:
XMLHttpRequest ไม่สามารถโหลดhttp://server.dev/test
ได้ ส่วนหัว "Access-Control-Allow-Origin" มีค่าhttp://client1.dev
ที่ไม่เท่ากับต้นทางที่ให้มา Origin http://client2.dev
จึงไม่อนุญาตให้เข้าถึง
เอกสารที่ฉันอ่านดูเหมือนจะไม่ถูกต้อง แท็บเครือข่ายของ Chrome แสดงทั้งส่วนหัวของคำขอและการตอบกลับอย่างชัดเจนhttp://client1.dev
แต่คุณจะเห็นข้อผิดพลาดที่ Chrome รู้ว่าต้นกำเนิดที่แท้จริงคืออะไรhttp://client2.dev
และปฏิเสธการตอบกลับอย่างถูกต้อง ซึ่งไม่สำคัญในตอนนี้เนื่องจากเซิร์ฟเวอร์ได้ยอมรับคำขอปลอมและใช้เงินของฉันไปแล้ว
foo.com
) จะสามารถให้Access-Control-Allow-Origin
ส่วนหัวหรืออื่น ๆbar.com
ที่เบราว์เซอร์ไม่อนุญาตให้มีการร้องขอไปยัง