Ich habe eine XMLHttpRequest geschrieben, die gut läuft, aber einen leeren Antworttext zurückgibt.
Das Javascript lautet wie folgt:
var anUrl = "http://api.xxx.com/rates/csv/rates.txt";
var myRequest = new XMLHttpRequest();
callAjax(anUrl);
function callAjax(url) {
myRequest.open("GET", url, true);
myRequest.onreadystatechange = responseAjax;
myRequest.setRequestHeader("Cache-Control", "no-cache");
myRequest.send(null);
}
function responseAjax() {
if(myRequest.readyState == 4) {
if(myRequest.status == 200) {
result = myRequest.responseText;
alert(result);
alert("we made it");
} else {
alert( " An error has occurred: " + myRequest.statusText);
}
}
}
Der Code läuft gut. Ich kann durchgehen und bekomme den readyState == 4 und einen Status == 200, aber der responseText ist immer leer.
Ich erhalte einen Protokollfehler (im Safari-Debug) von Error Dispatching: getProperties, auf den ich anscheinend keinen Verweis finden kann.
Ich habe den Code in Safari und Firefox sowohl lokal als auch auf einem Remote-Server ausgeführt.
Wenn die URL in einen Browser eingegeben wird, gibt sie die Zeichenfolge zurück und gibt einen Statuscode von 200 an.
Ich habe ähnlichen Code für dieselbe URL in einem Mac-Widget geschrieben, das einwandfrei läuft, aber derselbe Code in einem Browser gibt nie ein Ergebnis zurück.
Etwas, das ich entdeckt habe und das zu einem Teil meiner anfänglichen Verwirrung geführt hat, ist, dass Safari ein modifiziertes Sicherheitsmodell hat, das es Dateien ermöglicht, die lokal ausgeführt werden, um auf Anfragen von jedem Ursprung zuzugreifen. Dies geschah, damit Dashboard-Widgets Kaltzugriffsanforderungen haben. Also habe ich anfangs ein Widget geschrieben, das funktionierte, dann, wenn ich Safari nicht benutzte oder von der lokalen Maschine aus, funktionierte es nicht. Allerdings bin ich gerade erst auf diesen Tweak gestoßen.
– PurplePilot
3. Mai ’10 um 6:50 Uhr
Daniel Wassallo
Ist http://api.xxx.com/ Teil Ihrer Domain? Wenn nicht, werden Sie von der blockiert gleiche Ursprungspolitik.
Vielleicht möchten Sie sich den folgenden Stack Overflow-Beitrag ansehen, um einige mögliche Problemumgehungen zu finden:
Möglichkeiten zur Umgehung der Same-Origin-Policy
Ich hatte das Gefühl, dass es daran liegen könnte. Der verwirrende Aspekt dabei ist, dass ich in einem Mac-Widget XMLHttpRequest verwendet habe, um dasselbe zu tun, und es funktioniert. Ich gehe davon aus, dass ich mich im Fall des Widgets nicht in einem Browser befinde, also nicht blockiert bin.
– PurplePilot
22. Dezember 2009 um 6:49 Uhr
Eigentlich hat dies nichts mit xss zu tun, das dadurch verursacht wird, dass Benutzereingaben nicht validiert werden. Die Verwendung von XHR für den Zugriff auf eine andere Domain stellt einen Verstoß gegen die Same Origin Policy dar: code.google.com/p/browsersec/wiki/Part2
– Turm
13. April 10 um 21:57 Uhr
@The Rook: Danke für den Hinweis. Meine Antwort korrigiert.
– Daniel Vasallo
13. April 10 um 22:06 Uhr
Iwan David
PROBLEM GELÖST
In meinem Fall war das Problem, dass ich den Ajax-Aufruf (mit $.ajax-, $.get- oder $.getJSON-Methoden von jQuery) mit mache vollständigen Pfad im URL-Parameter:
Aber der richtige Weg ist, den Wert von url wie folgt zu übergeben:
URL: “site/cgi-bin/serverApp.php”
Einige Browser kollidieren nicht und unterscheiden nicht zwischen dem einen oder anderen Text, aber in Firefox 3.6 für Mac OS nehmen Sie dies vollständigen Pfad wie “Cross-Site-Scripting“… noch etwas, im selben Browser wird unterschieden zwischen:
Tatsächlich ist es die richtige Sichtweise, aber die meisten Implementierungen machen keinen Unterschied, also bestand die Lösung darin, den gesamten Text zu entfernen, der die spezifiziert vollständigen Pfad zum Skript in den Methoden, die die Ajax-Anforderung ausführen UND…. entfernen Sie alle BASE -Tag in der Datei index.html
base href=”http://mydomain.com/” <--- schlechte Idee, entfernen Sie sie!
Wenn Sie es nicht entfernen, kann diese Version des Browsers für dieses System Ihre Ajax-Anfrage so behandeln, als wäre es eine Cross-Site-Anfrage!
Ich habe das gleiche Problem, aber nur auf dem Mac OS-Rechner. Das Problem ist, dass Firefox die Ajax-Antwort als “Cross-Site”-Aufruf behandelt, auf jedem anderen Computer/Browser funktioniert es einwandfrei. Ich habe dazu keine Hilfe gefunden (ich denke, das ist ein Firefox-Implementierungsproblem), aber ich werde den nächsten Code auf der Serverseite beweisen:
header('Content-type: application/json');
um sicherzustellen, dass der Browser die Daten als “json-Daten” erhält …
Das Hinzufügen des Antwortheaders Content-Type: application/json hat bei mir funktioniert.
– Dheerendra Kulkarni
8. Januar 15 um 9:03 Uhr
Jakob Relk
Der Browser verhindert Cross-Site-Scripting.
Wenn sich die URL außerhalb Ihrer Domain befindet, müssen Sie dies auf der Serverseite tun oder sie in Ihre Domain verschieben.
Dies ist möglicherweise nicht der beste Weg, dies zu tun. Aber es hat irgendwie für mich funktioniert, also werde ich damit laufen.
In meiner PHP-Funktion, die die Daten zurückgibt, füge ich eine Zeile vor der Rückgabezeile eine Echo-Anweisung hinzu, die die Daten wiedergibt, die ich senden möchte.
Jetzt sicher, warum es funktioniert hat, aber es hat funktioniert.
Wo
Hatte ein ähnliches Problem wie du. Was wir tun mussten, ist die hier gefundene document.domain-Lösung zu verwenden:
Möglichkeiten zur Umgehung der Same-Origin-Policy
Wir mussten auch auf der Seite des Webservice etwas ändern. Verwendet den hier gefundenen Header “Access-Control-Allow-Origin”:
Etwas, das ich entdeckt habe und das zu einem Teil meiner anfänglichen Verwirrung geführt hat, ist, dass Safari ein modifiziertes Sicherheitsmodell hat, das es Dateien ermöglicht, die lokal ausgeführt werden, um auf Anfragen von jedem Ursprung zuzugreifen. Dies geschah, damit Dashboard-Widgets Kaltzugriffsanforderungen haben. Also habe ich anfangs ein Widget geschrieben, das funktionierte, dann, wenn ich Safari nicht benutzte oder von der lokalen Maschine aus, funktionierte es nicht. Allerdings bin ich gerade erst auf diesen Tweak gestoßen.
– PurplePilot
3. Mai ’10 um 6:50 Uhr