Erreur de publication AJAX: refus de définir un en-tête non sécurisé "Connexion"

101

J'ai la fonction ajax personnalisée suivante qui publie des données dans un fichier PHP. Chaque fois que la publication de données se produit, j'obtiens les deux erreurs suivantes:

Refusé de définir un en-tête non sécurisé "Content-length"
Refusé de définir un en-tête non sécurisé "Connection"

Code:

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

Qu'est-ce que je fais mal?

tireur d'élite
la source
Salut Joey. Je l'ai parcouru avant de le publier ici. Je ne comprends toujours pas. Tout ce que j'ai à faire est de commenter les lignes setRequestHeader?
sniper

Réponses:

166

Supprimez ces deux lignes:

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

XMLHttpRequest n'est pas autorisé à définir ces en-têtes, ils sont définis automatiquement par le navigateur. La raison en est qu'en manipulant ces en-têtes, vous pourrez peut-être amener le serveur à accepter une deuxième requête via la même connexion, une qui ne passerait pas par les contrôles de sécurité habituels - ce serait une faille de sécurité dans le navigateur.

Wladimir Palant
la source
5
Quelle «vulnérabilité» Connection: closecause? Si vous savez qu'une demande prendra du temps, il devrait être possible de demander qu'elle ne lie pas la connexion persistante. Les navigateurs ne prennent pas en charge le pipelining des demandes non plus, donc si une demande de longue durée vient avant une demande normale, elle bloquera la deuxième demande pendant toute la durée de conservation. Si la demande de longue durée pouvait utiliser "Connection: close", alors il serait possible de demander qu'elle ne lie pas la connexion persistante et provoque (par exemple) un retard inutile de 5 secondes (où 5 secondes est le temps de maintien en vie).
doug65536
3
@ doug65536: Les navigateurs ne valident pas les valeurs d'en-tête, ils interdisent simplement de définir des en-têtes avec lesquels vous ne devriez pas jouer.
Wladimir Palant
Salut Wladimir, Comment puis-je passer mon paramètre si ces 2 lignes sont supprimées?
coderInrRain
@anunixercoder: Vous ne le faites pas. Ces deux en-têtes sont définis automatiquement par le navigateur et ne peuvent pas être modifiés.
Wladimir Palant
Re: "il devrait être possible de demander qu'il ne lie pas la connexion persistante." - ce n'est pas quoi | Connexion: fermer | Est-ce que.
EricLaw