Erro de postagem AJAX: recusou-se a definir o cabeçalho "Conexão" inseguro

101

Eu tenho a seguinte função ajax personalizada que posta dados em um arquivo PHP. Sempre que ocorre a postagem de dados, recebo os dois erros a seguir:

Recusou-se a definir o cabeçalho inseguro "Comprimento do conteúdo"
Recusou-se a definir o cabeçalho inseguro "Conexão"

Código:

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

O que estou fazendo de errado?

atirador de elite
fonte
Ei Joey. Eu passei por isso antes de postar aqui. Eu ainda não estou entendendo. Tudo que preciso fazer é comentar as linhas setRequestHeader?
atirador de

Respostas:

166

Remova essas duas linhas:

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

XMLHttpRequest não tem permissão para definir esses cabeçalhos, eles estão sendo definidos automaticamente pelo navegador. A razão é que, ao manipular esses cabeçalhos, você pode enganar o servidor para que aceite uma segunda solicitação pela mesma conexão, uma que não passaria pelas verificações de segurança normais - isso seria uma vulnerabilidade de segurança no navegador.

Wladimir Palant
fonte
5
Qual "vulnerabilidade" Connection: closecausa? Se você sabe que uma solicitação demorará muito, deve ser possível solicitar que ela não bloqueie a conexão persistente. Os navegadores também não oferecem suporte ao pipelining de solicitação, portanto, se uma solicitação de longa execução vier antes de uma solicitação normal, ela bloqueará a segunda solicitação pelo tempo de manutenção de atividade completo. Se a solicitação de longa execução pudesse usar "Conexão: fechar", seria possível solicitar que ela não prendesse a conexão persistente e causasse (por exemplo) um atraso desnecessário de 5 segundos (onde 5 segundos é o tempo de manutenção).
doug65536
3
@ doug65536: Os navegadores não validam os valores dos cabeçalhos, eles simplesmente não permitem a configuração de cabeçalhos com os quais você não deve mexer.
Wladimir Palant
Olá Wladimir, Como passo meu parâmetro se essas 2 linhas forem removidas?
coderInrRain
@anunixercoder: Você não. Esses dois cabeçalhos são definidos automaticamente pelo navegador e não podem ser alterados.
Wladimir Palant
Re: "deve ser possível solicitar que não bloqueie a conexão persistente." - não é isso que | Conexão: fechar | faz.
EricLaw