web-dev-qa-db-fra.com

WebKit "Refus de définir un en-tête non sécurisé 'content-length'"

J'essaie d'implémenter une abstraction xhr simple et j'obtiens cet avertissement lorsque j'essaie de définir les en-têtes pour un POST. Je pense que cela pourrait avoir quelque chose à voir avec la définition des en-têtes dans un fichier js distinct, car lorsque je les ai définis dans le <script> tag dans le fichier .html, cela a bien fonctionné. La demande POST fonctionne correctement, mais je reçois cet avertissement et je suis curieux de savoir pourquoi. J'obtiens cet avertissement pour les deux content-length et connection en-têtes, mais uniquement dans les navigateurs WebKit (Chrome 5 beta et Safari 4). Dans Firefox, je ne reçois aucun avertissement, l'en-tête Content-Length est défini sur la valeur correcte, mais la connexion est définie sur keep-alive au lieu de fermer, ce qui me fait penser qu'elle ignore également mes appels setRequestHeader et génère sa propre. Je n'ai pas essayé ce code dans IE. Voici le balisage et le code:

test.html:

<!DOCTYPE html>
<html>
    <head>
        <script src="jsfile.js"></script>
        <script>
            var request = new Xhr('POST', 'script.php', true, 'data=somedata',  function(data) { 
                console.log(data.text); 
            });
        </script>
    </head>
    <body>
    </body>
</html>

jsfile.js:

function Xhr(method, url, async, data, callback) {
    var x;
    if(window.XMLHttpRequest) {
        x = new XMLHttpRequest();

        x.open(method, url, async);

        x.onreadystatechange = function() {
            if(x.readyState === 4) {
                if(x.status === 200) {
                    var data = {
                        text: x.responseText,
                        xml: x.responseXML
                    };
                    callback.call(this, data);
                }
            }
        }

        if(method.toLowerCase() === "post") {
            x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            x.setRequestHeader("Content-Length", data.length);
            x.setRequestHeader("Connection", "close");
        }

        x.send(data);
    } else {
        // ... implement IE code here ...
    }
    return x;
}
47
Paul Woolcock

il ignore également mes appels setRequestHeader et génère son propre

Oui, le standard dit qu'il doit:

Pour des raisons de sécurité, ces étapes doivent être interrompues si l'en-tête est [...]

  • Connexion
  • Contenu-Longueur

Jouer avec ceux-ci pourrait exposer diverses attaques demande de contrebande , de sorte que le navigateur utilise toujours ses propres valeurs. Il n'y a ni besoin ni raison d'essayer de définir la longueur de la demande, car le navigateur peut le faire avec précision à partir de la longueur des données que vous transmettez à send().

63
bobince