web-dev-qa-db-fra.com

Refus de définir un en-tête dangereux "Origin" lors de l'utilisation de xmlHttpRequest de Google Chrome

Vous avez ce message d'erreur: Refused to set unsafe header "Origin"

En utilisant ce code:

   function getResponse() {
            document.getElementById("_receivedMsgLabel").innerHTML += "getResponse() called.<br/>";
            if (receiveReq.readyState == 4 || receiveReq.readyState == 0) {
                receiveReq.open("GET", "http://L45723:1802", true, "server", "server123");  //must use L45723:1802 at work.
                receiveReq.onreadystatechange = handleReceiveMessage;
                receiveReq.setRequestHeader("Origin", "http://localhost/");
                receiveReq.setRequestHeader("Access-Control-Request-Origin", "http://localhost");
                receiveReq.timeout = 0;
                var currentDate = new Date();
                var sendMessage = JSON.stringify({
                    SendTimestamp: currentDate,
                    Message: "Message 1",
                    Browser: navigator.appName
                });
                receiveReq.send(sendMessage);

            }
        }

Qu'est-ce que je fais mal? Que manque-t-il dans l'en-tête pour que cette demande CORS fonctionne?

J'ai essayé de supprimer l'appel receiveReq.setRequestHeader("Origin", ...) mais ensuite Google Chrome lance une erreur d'accès sur mon appel receiveReq.open() ...

Pourquoi?

19
Derrick LAU

C'est juste une supposition, car j'utilise jquery pour les requêtes ajax, y compris CORS.

Je pense que le navigateur est censé définir l'en-tête, pas vous. Si vous pouviez définir l'en-tête, cela irait à l'encontre de l'objectif de la fonction de sécurité.

Essayez la demande sans définir ces en-têtes et voyez si le navigateur les définit pour vous.

14
Brian S

Dans CORS, le code appelant n'a à effectuer aucune configuration spéciale. Tout doit être géré par le navigateur. C'est le travail du serveur de décider si la demande doit être autorisée ou non. Donc, chaque fois que vous faites une demande qui rompt SOP politique, le navigateur essaiera de faire une demande CORS pour vous (il ajoutera automatiquement l'en-tête Origin, et fera éventuellement une demande de contrôle en amont si vous êtes en utilisant certains en-têtes/méthodes/types de contenu dangereux). Si le serveur prend en charge CORS, il répondra correctement et autorisera/refusera la demande en fournissant des en-têtes de réponse spécifiques à CORS comme

Access-Control-Allow-Origin: *

Gardez à l'esprit que Chrome est très restrictif sur le nom d'hôte "localhost". (Au moins, c'était quand je travaillais avec lui). Utilisez plutôt le nom de votre ordinateur ou attribuez-lui un autre alias dans "hosts" "Par exemple, n'accédez pas à votre site comme:

http://localhost:port/myappname

Utilisez plutôt:

http://mymachinename:port/myappname

ou

http://mymachinealias:port/myappname

Pour plus de détails, veuillez vérifier spécification .

9
MeTTeO