comment contourner Access-Control-Allow-Origin?
Je fais un appel ajax pour mon propre serveur sur une plate-forme qu'ils se sont fixés éviter ces appels ajax (mais j'ai besoin de récupérer des données à partir de mon serveur pour afficher les données récupérées à partir de mon serveur de base de données).
Mon script ajax est au travail , il peut envoyer les données sur mon serveur de script php pour l'autoriser à traiter.
Toutefois, il ne peut pas obtenir les données traitées à l'arrière comme il est bloqué par "Access-Control-Allow-Origin"
Je n'ai pas accès à cette plate-forme de la source/core. donc je ne peux pas supprimer le script qu'il me refusant à le faire.
(P/S j'ai utilisé Google Chrome Console et a trouvé 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 est-il un JSON
code équivalent à l'ajax script ci-dessus ? Je pense que JSON
est autorisé.
J'espère que quelqu'un pourrait m'aider.
- toutes les réponses à vos questions jusqu'à présent, a expliqué un moyen de réécrire votre serveur de code ajax travail. Aucun d'eux n'est à propos de contournement, comme vous l'avez demandé spécifiquement à votre question. Avez-vous trouvé de toute façon de contourner cet en-tête? Je doute vraiment qu'il y aurait un.
Vous devez vous connecter pour publier un commentaire.
Le mettre sur le dessus de retrieve.php:
Noter que cela permet de désactiver la protection de la SCRO, et les feuilles de vos utilisateurs exposés à l'attaque. Si vous n'êtes pas absolument certain que vous avez besoin pour permettre à tous origines, vous devez le verrouiller cette baisse à un plus spécifiques origine:
header('Access-Control-Allow-Origin: ' . 'http' . ( ( array_key_exists( 'HTTPS', $_SERVER ) && $_SERVER['HTTPS'] && strtolower( $_SERVER['HTTPS'] ) !== 'off' ) ? 's' : null ) . '://' . $_SERVER['HTTP_HOST'] );
Access-Control-Allow-Origin
en-tête supplémentaire pour chaque domaine.D'accord, mais vous savez tous que le * est un caractère générique qui permet de cross site scripting de chaque domaine?
Vous souhaitez envoyer plusieurs
Access-Control-Allow-Origin
en-têtes pour chaque site qui est permis, mais, malheureusement, ses pas officiellement pris en charge à envoyer plusieursAccess-Control-Allow-Origin
en-têtes, ou de les mettre dans de multiples origines.Vous pouvez résoudre ce problème en vérifiant l'origine, et de l'envoi de retour que l'un dans l'en-tête, si elle est autorisée:
C'est beaucoup plus sûr. Vous pouvez modifier la mise en correspondance et de le modifier pour une fonction manuelle avec quelques regex, ou quelque chose comme ça. Au moins cela ne fera que renvoyer 1 en-tête, et vous serez sûr de sa celui qui la demande est faite par. Veuillez noter que tous les en-têtes HTTP peut être usurpée, mais cet en-tête est pour le client de protection. Ne pas protéger vos propres données avec ces valeurs. Si vous voulez en savoir plus, lisez un peu sur la SCRO et CSRF.
Pourquoi est-il plus sûr?
Permettant l'accès à partir d'autres endroits, alors votre propre site de confiance permet pour la session de détournements. Je vais aller un petit exemple d'image de Facebook permet à un générique d'origine, ce qui signifie que vous pouvez faire votre propre site web quelque part, et de faire feu appels AJAX (ou ouvrir les iframes) à facebook. Cela signifie que vous pouvez saisir le connecté info sur le facebook d'un visiteur de votre site web. Pire, vous pouvez créer un script
POST
demandes et publier des données sur quelqu'un facebook - tout alors qu'ils sont à la navigation de votre site web.Être très prudent lors de l'utilisation de la
ACAO
les en-têtes de!Access-Control-Allow-Origin: http:*.mysite1.com
?header()
remplace le précédent en-tête du même type. Alors, vraiment tout ce que vous faites est la dernière d'en-tête. Le saisie manuelle les états que vous pouvez définir un deuxième paramètre defalse
pour empêcher l'en-tête précédent d'être écrasées.$_SERVER['HTTP_REFERER']
de match, puis retourne l'en-tête. L'envoi de plusieurs en-têtes risquent de ne pas fonctionner maintenant.Avertissement, Chrome (et les autres navigateurs) va se plaindre que de multiples ACAO les en-têtes sont ensemble si vous suivez quelques-uns 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.
Essayez ceci:
J'ai résolu ce problème lors de l'appel d'un MVC3 Contrôleur.
J'ai ajouté:
avant mon
Et aussi mon
$.ajax
se plaignait qu'il n'accepte pas Content-type en-tête de mon appel ajax, donc je lui ai dit que je sais que son JSON être passé à l'Action.Espère que ça aide.
le mieux serait de permettre à des domaines uniques, soyez prudent sur le site http://:
header()
et mis àfalse
, sinon le second en-tête remplacera le premier:header('Access-Control-Allow-Origin: http://www.foo.com', false);
Avez-vous essayé d'ajouter l'Access-Control-Allow-Origin-tête de la réponse envoyée à partir de votre serveur? Comme,
Access-Control-Allow-Origin: *
?C'est une très mauvaise idée d'utiliser
*
, ce qui vous laisse largement ouvert cross site scripting. En gros, vous voulez que votre propre nom de domaine, tout le temps, l'étendue actuelle de votre les paramètres SSL, et éventuellement d'autres domaines. Vous aussi, vous voulez tous être envoyé comme un en-tête. La suite sera toujours autoriser votre propre nom de domaine dans le même SSL portée de la page en cours, et peut éventuellement aussi inclure n'importe quel nombre de domaines supplémentaires. Il va les envoyer tous un en-tête, et écraser le précédent(s) si quelque chose d'autre est déjà envoyés afin d'éviter toute chance de le navigateur se plaindre de plusieurs de contrôle d'accès des en-têtes envoyés.Utilisation:
Vous obtenez l'idée.