ป้องกันการเปลี่ยนเส้นทางของ Xmlhttprequest


112

เป็นไปได้หรือไม่ที่จะป้องกันไม่ให้เบราว์เซอร์ติดตามการเปลี่ยนเส้นทางเมื่อส่ง XMLHttpRequest-s (เช่นรับรหัสสถานะการเปลี่ยนเส้นทางกลับมาและจัดการด้วยตัวเอง)

คำตอบ:


102

ไม่เป็นไปตามมาตรฐาน W3C สำหรับอ็อบเจ็กต์ XMLHttpRequest (เน้นเพิ่ม):

หากการตอบกลับเป็นการเปลี่ยนเส้นทาง HTTP:

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

พวกเขากำลังพิจารณาเรื่องนี้สำหรับการเปิดตัวในอนาคต:

ข้อกำหนดนี้ไม่รวมคุณสมบัติต่อไปนี้ซึ่งอยู่ระหว่างการพิจารณาสำหรับเวอร์ชันอนาคตของข้อกำหนดนี้:

  • คุณสมบัติในการปิดใช้งานการเปลี่ยนเส้นทางต่อไปนี้

แต่ข้อกำหนดล่าสุดไม่ได้กล่าวถึงเรื่องนี้อีกต่อไป


5
สิ่งที่น่าขันคือเมื่อการเปลี่ยนเส้นทางแบบโปร่งใสเกี่ยวข้องกับการเขียนทับส่วนหัว HTTP บางส่วนที่ตั้งค่าไว้ในคำขอเดิม โดยเฉพาะอย่างยิ่งถ้าส่วนหัว "ยอมรับ" ถูกตั้งค่าเป็นประเภทเนื้อหาเฉพาะ Firefox จะไม่รวมส่วนหัวนี้เมื่อติดตามการเปลี่ยนเส้นทาง (ซึ่งทำให้การพัฒนาบริการเว็บที่ใช้ REST เต็มรูปแบบซึ่งใช้ส่วนหัวนี้ทำได้ยากขึ้นเล็กน้อย ... บ่น).
ruquay

1
การค้นหาเพิ่มเติมทำให้ฉันรายงานข้อผิดพลาดที่ค่อนข้างเก่านี้: bugzilla.mozilla.org/show_bug.cgi?id=401564
ruquay

2
เห็นด้วยข้อบกพร่องในการออกแบบ rediculus โดยสิ้นเชิง
Rasive

35

ใหม่Fetch APIสนับสนุนโหมดที่แตกต่างของการจัดการการเปลี่ยนเส้นทาง: follow, errorและmanual, แต่ฉันไม่สามารถหาวิธีที่จะดู URL ใหม่หรือรหัสสถานะเมื่อเปลี่ยนเส้นทางได้ถูกยกเลิกแล้ว คุณสามารถหยุดการเปลี่ยนเส้นทางได้เองจากนั้นดูเหมือนข้อผิดพลาด (การตอบกลับว่างเปล่า) หากนั่นคือทั้งหมดที่คุณต้องการคุณก็พร้อมที่จะไป นอกจากนี้คุณควรจะตระหนักว่าการร้องขอที่ทำผ่าน API นี้จะไม่ได้บอกเลิกเลย พวกเขาอยู่ในขณะนี้

สำหรับ XMLHttpRequest คุณสามารถHEADเซิร์ฟเวอร์และตรวจสอบว่า URL มีการเปลี่ยนแปลงหรือไม่:

var http = new XMLHttpRequest();
http.open('HEAD', '/the/url');
http.onreadystatechange = function() {
    if (this.readyState === this.DONE) {
        console.log(this.responseURL);
    }
};
http.send();

คุณจะไม่ได้รับรหัสสถานะ แต่จะพบ URL ใหม่โดยไม่ต้องดาวน์โหลดทั้งหน้าจากมัน


บางครั้งการใช้OPTIONSอาจเป็นทางเลือกที่ดีกว่าอย่างไรก็ตามใช้ได้เฉพาะกับวัตถุประสงค์ทั่วไปเท่านั้นเป็นต้นผู้ดูแลระบบได้กำหนดค่าการเปลี่ยนเส้นทางไซต์ / สคีมาทั้งหมดเช่น HTTP -> HTTPS
William Leung

12

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



11

ไม่มีคุณไม่มีที่ใดใน API ที่เปิดเผยโดย XMLHttpRequest ที่ช่วยให้คุณสามารถลบล้างพฤติกรรมเริ่มต้นของการติดตาม 301 หรือ 302 โดยอัตโนมัติ

หากไคลเอนต์กำลังเรียกใช้ IE บน windows คุณสามารถใช้ WinHTTP แทนเพื่อตั้งค่าตัวเลือกเพื่อป้องกันพฤติกรรมนั้น แต่เป็นวิธีแก้ปัญหาที่ จำกัด มาก

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