ข้อผิดพลาดในการโพสต์ AJAX: ปฏิเสธที่จะตั้งค่าส่วนหัว "การเชื่อมต่อ" ที่ไม่ปลอดภัย


101

ฉันมีฟังก์ชัน ajax ที่กำหนดเองต่อไปนี้ซึ่งโพสต์ข้อมูลกลับไปยังไฟล์ PHP ทุกครั้งที่มีการโพสต์ข้อมูลฉันได้รับข้อผิดพลาดสองข้อต่อไปนี้:

ปฏิเสธที่จะตั้งค่าส่วนหัวที่ไม่ปลอดภัย "ความยาวของเนื้อหา"
ปฏิเสธที่จะตั้งค่าส่วนหัวที่ไม่ปลอดภัย "การเชื่อมต่อ"

รหัส:

function passposturl(url1, params, obj)
{
    //url1 = url1+"&sid="+Math.random();
    xmlHttp = get_xmlhttp_obj();
    xmlHttp.loadflag = obj;
    xmlHttp.open("POST", url1, true);
    //alert(url1);
    //alert(params);
    //alert(obj);
    //alert(params.length);
    xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlHttp.setRequestHeader("Content-length", params.length);
    xmlHttp.setRequestHeader("Connection", "close");
    xmlHttp.onreadystatechange = function ()
    {
        stateChanged(xmlHttp);
    };
    xmlHttp.send(params);
 }

ผมทำอะไรผิดหรือเปล่า?



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

คำตอบ:


167

ลบสองบรรทัดนี้:

xmlHttp.setRequestHeader("Content-length", params.length);
xmlHttp.setRequestHeader("Connection", "close");

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


5
"ช่องโหว่" Connection: closeก่อให้เกิดอะไร? หากคุณทราบว่าคำขอจะใช้เวลานานคุณควรขอให้ไม่เชื่อมโยงการเชื่อมต่อแบบถาวร เบราว์เซอร์ไม่รองรับการร้องขอการไปป์ไลน์ด้วยเช่นกันดังนั้นหากคำขอที่ทำงานเป็นเวลานานมาก่อนคำขอปกติคำขอนั้นจะบล็อกคำขอที่ 2 สำหรับเวลาเก็บรักษาทั้งหมด หากคำขอที่ทำงานเป็นเวลานานสามารถใช้ "การเชื่อมต่อ: ปิด" ได้ก็จะเป็นไปได้ที่จะขอให้ไม่ผูกการเชื่อมต่อแบบต่อเนื่องและทำให้เกิด (เช่น) การหน่วงเวลา 5 วินาทีโดยไม่จำเป็น (โดยที่ 5 วินาทีคือเวลาที่มีชีวิตอยู่)
doug65536

3
@ doug65536: เบราว์เซอร์ไม่ตรวจสอบความถูกต้องของค่าส่วนหัวพวกเขาไม่อนุญาตให้ตั้งค่าส่วนหัวที่คุณไม่ควรยุ่ง
Wladimir Palant

สวัสดี Wladimir ฉันจะส่งพารามิเตอร์ของฉันได้อย่างไรหากลบ 2 บรรทัดนั้นออกไป
zukijuki

@anunixercoder: คุณทำไม่ได้ ส่วนหัวทั้งสองนี้ถูกกำหนดโดยเบราว์เซอร์โดยอัตโนมัติและไม่สามารถเปลี่ยนแปลงได้
Wladimir Palant

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