238 votes

comment contourner le contrôle d'accès "autoriser l'origine" ?

Je fais un appel ajax vers mon propre serveur sur une plateforme qui a été configurée pour empêcher ces appels ajax (mais j'ai besoin qu'elle récupère les données de mon serveur pour afficher les données récupérées dans la base de données de mon serveur). Mon script ajax fonctionne, il peut envoyer les données vers le script php de mon serveur pour lui permettre de les traiter. Cependant, il ne peut pas récupérer les données traitées car il est bloqué par "Access-Control-Allow-Origin"

Je n'ai pas accès aux sources/core de cette plateforme. Je ne peux donc pas supprimer le script qui m'empêche de le faire. (P/S J'ai utilisé la console de Google Chrome et j'ai trouvé cette erreur)

Le code Ajax est présenté ci-dessous :

 $.ajax({
     type: "GET",
     url: "http://example.com/retrieve.php",
     data: "id=" + id + "&url=" + url,
     dataType: 'json',   
     cache: false,
     success: function(data)
      {
        var friend = data[1];              
        var blog = data[2];           
        $('#user').html("<b>Friends: </b>"+friend+"<b><br> Blogs: </b>"+blog);

      } 
  });

ou existe-t-il un JSON code équivalent à l'ajax script ci-dessus ? Je pense JSON est autorisé.

J'espère que quelqu'un pourra m'aider.

0 votes

Toutes les réponses à votre question jusqu'à présent ont expliqué un moyen de réécrire le code de votre serveur pour que l'ajax fonctionne. Aucune d'entre elles ne traite du contournement, comme vous l'avez demandé spécifiquement dans votre question. Avez-vous trouvé un moyen de contourner cet en-tête ? Je doute vraiment qu'il y en ait un.

0 votes

Il n'y a pas de moyen de le passer par baypass. mais vous pouvez mettre un fichier sur votre backend qui effectue la requête. Ainsi vous appelez par ajax le fichier sur votre propre serveur, ce fichier charge les données de retrieve.php et les renvoie à votre javascript. Dans ce cas, il n'y a pas de règles CORS qui vous bloquent.

0 votes

Le protocole Websocket sécurisé wss:// n'est pas soumis au blocage CORS.

425voto

3nigma Points 21164

Mettez ça au dessus de retrieve.php :

header('Access-Control-Allow-Origin: *');

Notez que cela désactive effectivement la protection CORS, et laisse vos utilisateurs exposés aux attaques. Si vous n'êtes pas tout à fait certain de la nécessité d'autoriser le tous origines, vous devriez verrouiller cela à une origine plus spécifique :

header('Access-Control-Allow-Origin: https://www.example.com');

Veuillez vous référer à la réponse de la pile suivante pour mieux comprendre les éléments suivants Access-Control-Allow-Origin

https://stackoverflow.com/a/10636765/413670

57 votes

C'est plutôt dangereux. Regardez ma réponse en bas de page.

3 votes

Tnx, mais vous ne devriez pas permettre l'accès à toutes les origines comme mentionné par @RobQuist dans son commentaire, et dans sa réponse a fourni une meilleure approche

2 votes

J'ai trouvé cette page parce que j'avais besoin de "contourner" le contrôle d'accès sur un serveur. La solution ici n'est pas de contourner quoi que ce soit mais simplement de configurer correctement le contrôle d'accès sur son propre serveur. Si quelqu'un a besoin de contourner ce contrôle, il peut utiliser la fonction PHP file_get_contents($remote_url) ;. Il y a évidemment de nombreuses façons de le faire, mais c'est ainsi que je l'ai fait.

308voto

Rob Quist Points 694

D'accord, mais vous savez tous que l'astérisque (*) est un caractère générique et qu'il permet l'exécution de scripts intersites à partir de tous les domaines ?

Vous souhaitez envoyer plusieurs Access-Control-Allow-Origin pour chaque site autorisé à le faire, mais malheureusement, il n'est pas officiellement possible d'envoyer plusieurs en-têtes Access-Control-Allow-Origin ou pour mettre en place des origines multiples.

Vous pouvez résoudre ce problème en vérifiant l'origine, et en renvoyant celle-là dans l'en-tête, si elle est autorisée :

$origin = $_SERVER['HTTP_ORIGIN'];
$allowed_domains = [
    'http://mysite1.com',
    'https://www.mysite2.com',
    'http://www.mysite2.com',
];

if (in_array($origin, $allowed_domains)) {
    header('Access-Control-Allow-Origin: ' . $origin);
}

C'est beaucoup plus sûr. Vous pouvez modifier la correspondance et la transformer en une fonction manuelle avec une expression rationnelle, ou quelque chose de ce genre. Au moins, cela ne renverra qu'un seul en-tête, et vous serez sûr que c'est celui d'où provient la demande. Veuillez noter que tous les en-têtes HTTP peut peuvent être usurpés, mais cet en-tête est pour la protection du client. Ne protégez pas vos propres données avec ces valeurs. Si vous voulez en savoir plus, lisez un peu sur CORS et CSRF.

Pourquoi est-ce plus sûr ?

Autoriser l'accès à partir d'autres sites que votre propre site de confiance permet le détournement de session. Je vais prendre un petit exemple - l'image Facebook permet une origine joker - cela signifie que vous pouvez créer votre propre site web quelque part, et lui faire lancer des appels AJAX (ou ouvrir des iframes) vers facebook. Cela signifie que vous pouvez récupérer les informations de connexion du facebook d'un visiteur de votre site web. Pire encore - vous pouvez script POST demande et publie des données sur le facebook de quelqu'un - juste pendant qu'il navigue sur votre site web.

Soyez très prudent lorsque vous utilisez le ACAO Les en-têtes !

13 votes

Je pense que vous devez mettre http:// devant chaque élément de la liste. C'est du moins ce que j'ai fait pour un site sur lequel je travaillais.

2 votes

Malheureusement, cela ne semble pas fonctionner. Je crois qu'une seule exception peut être fournie par appel à header().

5 votes

@Shanimal & lewsid -> Je suppose que la séparation par des virgules ne fonctionne pas en effet. Référence : w3.org/TR/cors

6voto

Atif Rehman Points 31

J'ai résolu ce problème en appelant un contrôleur MVC3. J'ai ajouté :

Response.AddHeader("Access-Control-Allow-Origin", "*"); 

avant mon

return Json(model, JsonRequestBehavior.AllowGet);

Et aussi mon $.ajax se plaignait du fait qu'il n'accepte pas Type de contenu dans mon appel ajax, je l'ai donc commenté car je sais que c'est du JSON qui est transmis à l'action.

J'espère que cela vous aidera.

2voto

daros Points 11

Cela fonctionne comme un charme pour moi dans ma version mobile :

De http://m.example.com Je n'ai pas pu atteindre un fichier .php à partir de mon ordinateur. http://example.com

J'ai donc modifié mon fichier .php comme suit :

header('Access-Control-Allow-Origin: http://m.example.com');

Fonctionne très bien ! Merci

0voto

Daniel Brockman Points 4282

Avez-vous essayé d'ajouter l'en-tête Access-Control-Allow-Origin à la réponse envoyée par votre serveur ? Par exemple, Access-Control-Allow-Origin: * ?

1 votes

Il s'agit d'un en-tête HTTP que votre serveur envoie pour informer le navigateur qu'il est correct de révéler le résultat au script appelant malgré le fait que le domaine d'origine du script ne correspond pas au domaine du serveur. Lire la suite Partage de ressources inter-origine !

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