Lỗi bài đăng AJAX: Từ chối đặt tiêu đề không an toàn “Kết nối”


101

Tôi có hàm ajax tùy chỉnh sau để đăng dữ liệu trở lại tệp PHP. Mỗi khi đăng dữ liệu xảy ra, tôi gặp hai lỗi sau:

Từ chối đặt tiêu đề không an toàn "Độ dài nội dung"
Từ chối đặt tiêu đề không an toàn "Kết nối"

Mã:

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

Tôi đang làm gì sai?



Này Joey. Tôi đã xem qua điều đó trước khi tôi đăng nó ở đây. Tôi vẫn chưa hiểu. Tất cả những gì tôi phải làm là nhận xét các dòng setRequestHeader?
sniper

Câu trả lời:


166

Xóa hai dòng sau:

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

XMLHttpRequest không được phép đặt các tiêu đề này, chúng đang được trình duyệt đặt tự động. Lý do là bằng cách thao túng các tiêu đề này, bạn có thể lừa máy chủ chấp nhận yêu cầu thứ hai thông qua cùng một kết nối, một yêu cầu sẽ không trải qua các bước kiểm tra bảo mật thông thường - đó sẽ là một lỗ hổng bảo mật trong trình duyệt.


5
"Lỗ hổng" nào Connection: closegây ra? Nếu bạn biết một yêu cầu sẽ mất một thời gian dài, nó sẽ có thể yêu cầu rằng nó không phải tie lên kết nối liên tục. Các trình duyệt cũng không hỗ trợ tổng hợp yêu cầu, vì vậy nếu một yêu cầu đang chạy dài xuất hiện trước một yêu cầu bình thường, thì nó sẽ chặn yêu cầu thứ hai trong toàn bộ thời gian lưu giữ. Nếu yêu cầu đang chạy dài có thể sử dụng "Kết nối: đóng" thì có thể yêu cầu đó không buộc kết nối liên tục và gây ra (ví dụ) độ trễ 5 giây không cần thiết (trong đó 5 giây là thời gian duy trì).
doug65536

3
@ doug65536: Các trình duyệt không xác thực các giá trị tiêu đề, họ chỉ đơn giản là không cho phép đặt các tiêu đề mà bạn không nên làm phiền.
Wladimir Palant

Xin chào Wladimir, Làm cách nào để chuyển tham số của tôi nếu 2 dòng đó bị xóa?
coderInrRain

@anunixercoder: Bạn không. Hai tiêu đề này được đặt tự động bởi trình duyệt và không thể thay đổi.
Wladimir Palant

Re: "Có thể yêu cầu nó không ràng buộc kết nối liên tục." - đó không phải là điều | Kết nối: đóng lại | làm.
EricLaw
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.