AJAX发布错误:拒绝设置不安全的标头“连接”


101

我有以下自定义ajax函数,可将数据发布回PHP文件。每当发生数据发布时,都会出现以下两个错误:

拒绝设置不安全标头“ Content-length”
拒绝设置不安全标头“ Connection”

代码:

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行?
狙击手

Answers:


166

删除以下两行:

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

不允许XMLHttpRequest设置这些标头,它们是由浏览器自动设置的。原因是通过操纵这些标头,您可能能够欺骗服务器通过同一连接接受第二个请求,而该请求不会通过通常的安全检查-这将是浏览器中的一个安全漏洞。


5
Connection: close造成什么“漏洞” ?如果您知道请求将花费很长时间,则应该可以请求它不占用持久连接。浏览器也不支持请求流水线,因此,如果长时间运行的请求比正常请求先到,那么它将在完整的保持活动时间内阻止第二个请求。如果长时间运行的请求可以使用“连接:关闭”,则可以请求它不阻塞持久连接,并导致(例如)不必要的5秒延迟(其中5秒是保持活动时间)。
doug65536

3
@ doug65536:浏览器不验证标头值,它们只是禁止设置您不应该使用的标头。
弗拉基米尔·帕兰特

嗨,弗拉基米尔,如果删除了这两行,我如何传递参数?
coderInrRain

@anunixercoder:你没有。这两个标头是由浏览器自动设置的,无法更改。
弗拉基米尔·帕兰特

回复:“应该有可能要求它不阻塞持久连接。” -不是那个|连接:关闭| 做。
EricLaw
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.