108 votes

Erreur de post AJAX : Refused to set unsafe header "Connection" (Refus de définir un en-tête non sécurisé)

J'ai la fonction ajax personnalisée suivante qui renvoie des données dans un fichier PHP. Chaque fois que l'envoi de données se produit, je reçois les deux erreurs suivantes :

Refus de mettre l'en-tête non sécurisé "Content-length".
Refus de mettre l'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 de mal ?

2 votes

0 votes

Hé Joey. Je l'ai parcouru avant de le poster ici. Je ne le reçois toujours pas. Tout ce que j'ai à faire est de commenter les lignes setRequestHeader ?

177voto

Wladimir Palant Points 34829

Retirez 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 pourriez inciter le serveur à accepter une deuxième demande via la même connexion, une demande qui ne passerait pas par les contrôles de sécurité habituels - ce serait une faille de sécurité dans le navigateur.

5 votes

Que fait la "vulnérabilité" ? Connection: close cause ? Si vous savez qu'une demande va prendre beaucoup de temps, c'est debe Il est possible de demander à ce que la connexion persistante ne soit pas interrompue. Les navigateurs ne supportent pas non plus le pipelining des requêtes, donc si une requête longue arrive avant une requête normale, elle bloquera la deuxième requête pendant toute la durée du keepalive. Si la requête en cours d'exécution pouvait utiliser "Connection : close", il serait alors possible de demander qu'elle ne bloque pas la connexion persistante et ne cause pas (par exemple) un délai inutile de 5 secondes (où 5 secondes est le temps de maintien de la connexion).

3 votes

@doug65536 : Les navigateurs ne valident pas les valeurs des en-têtes, ils empêchent simplement la mise en place d'en-têtes avec lesquels vous ne devriez pas jouer.

0 votes

Bonjour Wladimir, Comment je passe mon paramètre si ces 2 lignes sont supprimées ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X