Kesalahan pengeposan AJAX: Menolak untuk menyetel header yang tidak aman "Sambungan"

101

Saya memiliki fungsi ajax khusus berikut yang memposting data kembali ke file PHP. Setiap kali posting data terjadi, saya mendapatkan dua kesalahan berikut:

Menolak menyetel header yang tidak aman "Panjang konten"
Menolak menyetel header yang tidak aman "Sambungan"

Kode:

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);
 }

Apa yang saya lakukan salah?

penembak jitu
sumber
Hei Joey. Saya sudah melalui itu sebelum saya mempostingnya di sini. Saya masih belum mengerti. Yang harus saya lakukan adalah mengomentari baris setRequestHeader?
penembak jitu

Jawaban:

166

Hapus dua baris ini:

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

XMLHttpRequest tidak diperbolehkan menyetel header ini, header ini disetel secara otomatis oleh browser. Alasannya adalah dengan memanipulasi header ini Anda mungkin dapat mengelabui server agar menerima permintaan kedua melalui koneksi yang sama, yang tidak akan melalui pemeriksaan keamanan biasa - itu akan menjadi kerentanan keamanan di browser.

Wladimir Palant
sumber
5
"Kerentanan" apa yang Connection: closemenyebabkan? Jika Anda tahu permintaan akan memakan waktu yang lama, itu harus mungkin untuk meminta bahwa hal itu tidak mengikat koneksi persisten. Browser juga tidak mendukung permintaan pipelining, jadi jika permintaan yang berjalan lama datang sebelum permintaan normal, maka itu akan memblokir permintaan kedua untuk waktu keepalive penuh. Jika permintaan yang berjalan lama dapat menggunakan "Connection: close" maka akan mungkin untuk meminta agar itu tidak mengikat koneksi persisten dan menyebabkan (misalnya) penundaan 5 detik yang tidak perlu (di mana 5 detik adalah waktu keep-hidup).
doug65536
3
@ doug65536: Peramban tidak memvalidasi nilai tajuk, mereka hanya melarang tajuk pengaturan yang tidak boleh Anda ganggu.
Wladimir Palant
Halo Wladimir, Bagaimana saya melewatkan parameter saya jika 2 baris tersebut dihapus?
coderInrRain
@anunixercoder: Anda tidak. Kedua header ini disetel secara otomatis oleh browser dan tidak dapat diubah.
Wladimir Palant
Re: "itu harus mungkin untuk meminta bahwa itu tidak mengikat koneksi persisten." - bukan itu yang | Koneksi: tutup | tidak.
EricLaw