Ich mache einen Ajax-Aufruf an meinen eigenen Server auf einer von ihnen festgelegten Plattform, um diese Ajax-Aufrufe zu verhindern (aber ich brauche ihn, um die Daten von meinem Server abzurufen und die abgerufenen Daten aus der Datenbank meines Servers anzuzeigen). Mein Ajax-Skript funktioniert. Es kann die Daten an das PHP-Skript meines Servers senden, damit es verarbeitet werden kann. Die verarbeiteten Daten können jedoch nicht zurückerhalten werden, da sie von blockiert werden"Access-Control-Allow-Origin"
Ich habe keinen Zugriff auf die Quelle / den Kern dieser Plattform. Daher kann ich das Skript nicht entfernen, das es mir nicht erlaubt. (P / SI hat die Google Chrome-Konsole verwendet und diesen Fehler festgestellt.)
Der Ajax-Code wie unten gezeigt:
$.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);
}
});
oder gibt es einen JSON
äquivalenten Code zum obigen Ajax-Skript? Ich denke JSON
ist erlaubt.
Ich hoffe jemand konnte mir helfen.
Antworten:
Setzen Sie dies oben auf retrieve.php:
Beachten Sie, dass dadurch der CORS-Schutz effektiv deaktiviert wird und Ihre Benutzer Angriffen ausgesetzt sind. Wenn Sie nicht ganz sicher sind, ob Sie alle Ursprünge zulassen müssen , sollten Sie dies auf einen genaueren Ursprung beschränken:
Weitere Informationen finden Sie in der folgenden Stapelantwort
Access-Control-Allow-Origin
https://stackoverflow.com/a/10636765/413670
quelle
Okay, aber Sie alle wissen, dass das * ein Platzhalter ist und Cross-Site-Scripting von jeder Domain aus ermöglicht?
Sie möchten
Access-Control-Allow-Origin
für jede Site, die dazu berechtigt ist, mehrereAccess-Control-Allow-Origin
Header senden. Leider wird das Senden mehrerer Header oder das Einfügen mehrerer Ursprünge offiziell nicht unterstützt .Sie können dies lösen, indem Sie den Ursprung überprüfen und diesen in der Kopfzeile zurücksenden, sofern dies zulässig ist:
Das ist viel sicherer. Möglicherweise möchten Sie die Übereinstimmung bearbeiten und in eine manuelle Funktion mit einem regulären Ausdruck oder Ähnlichem ändern. Zumindest wird dadurch nur 1 Header zurückgesendet, und Sie werden sicher sein, dass es derjenige ist, von dem die Anfrage kam. Bitte beachten Sie, dass alle HTTP - Header können gefälscht sein, aber dieser Header ist für den Schutz des Kunden. Schützen Sie Ihre eigenen Daten nicht mit diesen Werten. Wenn Sie mehr wissen möchten, lesen Sie etwas über CORS und CSRF.
Warum ist es sicherer?
Wenn Sie den Zugriff von anderen Standorten als Ihrer eigenen vertrauenswürdigen Site aus zulassen, können Sie Sitzungs-Highjacking durchführen. Ich werde mit einem kleinen Beispiel beginnen - Bild Facebook erlaubt einen Platzhalter-Ursprung - dies bedeutet, dass Sie Ihre eigene Website irgendwo erstellen und AJAX-Aufrufe (oder offene Iframes) an Facebook auslösen können. Dies bedeutet, dass Sie die angemeldeten Informationen auf Facebook eines Besuchers Ihrer Website abrufen können. Schlimmer noch - Sie können
POST
Anfragen per Skript schreiben und Daten auf Facebook veröffentlichen - nur während diese auf Ihrer Website surfen.Seien Sie sehr vorsichtig, wenn Sie die
ACAO
Header verwenden!quelle
header()
den vorherigen Header desselben Typs ersetzt. Sie setzen also wirklich nur den letzten Header. Der manuelle Eintrag besagt, dass Sie einen zweiten Parameter von festlegen können, umfalse
zu verhindern, dass der vorherige Header überschrieben wird.Warnung , Chrome (und andere Browser) beschweren sich, dass mehrere ACAO-Header festgelegt sind, wenn Sie einigen der anderen Antworten folgen.
Der Fehler wird so etwas wie sein
XMLHttpRequest cannot load ____. The 'Access-Control-Allow-Origin' header contains multiple values '____, ____, ____', but only one is allowed. Origin '____' is therefore not allowed access.
Versuche dies:
quelle
Ich habe dieses Problem beim Aufrufen eines MVC3-Controllers behoben. Ich fügte hinzu:
vor meinem
Außerdem habe ich mich
$.ajax
darüber beschwert, dass in meinem Ajax-Aufruf kein Header vom Typ Inhalt akzeptiert wird. Deshalb habe ich ihn auskommentiert, da ich weiß, dass sein JSON an die Aktion übergeben wird.Hoffentlich hilft das.
quelle
Es ist eine wirklich schlechte Idee
*
, die Sie für Cross-Site-Scripting offen lässt. Grundsätzlich möchten Sie ständig Ihre eigene Domain, die auf Ihre aktuellen SSL-Einstellungen und optional zusätzliche Domains beschränkt ist. Sie möchten auch, dass alle als ein Header gesendet werden. Im Folgenden wird immer Ihre eigene Domain im selben SSL-Bereich wie die aktuelle Seite autorisiert und kann optional auch eine beliebige Anzahl zusätzlicher Domains enthalten. Sie werden alle als ein Header gesendet und die vorherigen überschrieben, wenn sie bereits von einem anderen gesendet wurden, um zu verhindern, dass der Browser über das Senden mehrerer Header für die Zugriffssteuerung meckert.Verwendung:
Du hast die Idee.
quelle
Haben Sie versucht, der von Ihrem Server gesendeten Antwort tatsächlich den Header Access-Control-Allow-Origin hinzuzufügen? Wie
Access-Control-Allow-Origin: *
?quelle