Je fais un appel ajax à mon propre serveur sur une plate-forme qu'ils définissent empêcher ces appels ajax (mais j'en ai besoin pour récupérer les données de mon serveur pour afficher les données récupérées de la base de données de mon serveur). Mon script ajax fonctionne, il peut envoyer les données au script php de mon serveur pour lui permettre de traiter. Cependant, il ne peut pas récupérer les données traitées car elles sont bloquées par"Access-Control-Allow-Origin"
Je n'ai pas accès à la source / au cœur de cette plateforme. donc je ne peux pas supprimer le script qui m'interdit de le faire. (P / SI a utilisé la console de Google Chrome et a découvert cette erreur)
Le code Ajax comme indiqué 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 au script ajax ci-dessus? Je pense que JSON
c'est permis.
J'espère que quelqu'un pourrait m'aider.
Réponses:
Mettez ceci au-dessus de retrieve.php:
Notez que cela désactive efficacement la protection CORS et expose vos utilisateurs aux attaques. Si vous n'êtes pas complètement certain que vous devez autoriser toutes les origines, vous devez le verrouiller sur une origine plus spécifique:
Veuillez vous référer à la réponse suivante de la pile pour une meilleure compréhension de
Access-Control-Allow-Origin
https://stackoverflow.com/a/10636765/413670
la source
D'accord, mais vous savez tous que le * est un caractère générique et autorise les scripts intersites de tous les domaines?
Vous souhaitez envoyer plusieurs en-
Access-Control-Allow-Origin
têtes pour chaque site qui est autorisé à - mais malheureusement, il n'est officiellement pas pris en charge pour envoyer plusieurs en-Access-Control-Allow-Origin
têtes ou pour mettre plusieurs origines.Vous pouvez résoudre ce problème en vérifiant l'origine et en renvoyant celui-ci dans l'en-tête, si cela est autorisé:
C'est beaucoup plus sûr. Vous voudrez peut-être éditer la correspondance et la changer en une fonction manuelle avec une expression régulière, ou quelque chose comme ça. Au moins, cela ne renverra qu'un 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 peuvent être usurpés, mais cet en-tête est destiné à 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 emplacements, puis votre propre site de confiance permet de détourner la session. Je vais aller avec un petit exemple - l'image Facebook permet une origine générique - cela signifie que vous pouvez créer votre propre site Web quelque part, et le faire lancer des appels AJAX (ou ouvrir des iframes) vers Facebook. Cela signifie que vous pouvez récupérer les informations enregistrées du facebook d'un visiteur de votre site Web. Pire encore - vous pouvez écrire des
POST
requêtes et publier 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 les en-
ACAO
têtes!la source
header()
remplace l'en-tête précédent du même type. Donc, tout ce que vous faites est de définir le dernier en-tête. L' entrée manuelle indique que vous pouvez définir un deuxième paramètre defalse
pour empêcher l'écrasement de l'en-tête précédent.Attention , Chrome (et d'autres navigateurs) se plaindra que plusieurs en-têtes ACAO sont définis si vous suivez certaines des autres réponses.
L'erreur sera quelque chose comme
XMLHttpRequest cannot load ____. The 'Access-Control-Allow-Origin' header contains multiple values '____, ____, ____', but only one is allowed. Origin '____' is therefore not allowed access.
Essaye ça:
la source
J'ai résolu ce problème lors de l'appel d'un contrôleur MVC3. J'ai ajouté:
avant mon
Et aussi, je me
$.ajax
plaignais qu'il n'accepte pas l'en - tête Content-type dans mon appel ajax, donc je l'ai commenté car je sais que son JSON est passé à l'action.J'espère que cela pourra aider.
la source
C'est une très mauvaise idée à utiliser
*
, ce qui vous laisse largement ouvert aux scripts intersites. Vous voulez essentiellement votre propre domaine tout le temps, limité à vos paramètres SSL actuels et éventuellement à des domaines supplémentaires. Vous souhaitez également qu'ils soient tous envoyés dans un seul en-tête. Ce qui suit autorisera toujours votre propre domaine dans la même portée SSL que la page actuelle et peut éventuellement inclure également un nombre illimité de domaines supplémentaires. Il les enverra tous sous la forme d'un seul en-tête et remplacera les précédents si quelque chose d'autre les a déjà envoyés pour éviter que le navigateur ne se moque de l'envoi de plusieurs en-têtes de contrôle d'accès.Usage:
Vous avez eu l'idée.
la source
Avez-vous essayé d'ajouter réellement l'en-tête Access-Control-Allow-Origin à la réponse envoyée par votre serveur? Comme
Access-Control-Allow-Origin: *
,?la source