2010-10-24 12 views
5

Das neue Facebook Javascript SDK kann jede Website als Facebook-Benutzer anmelden und Daten eines Benutzers abrufen ...Warum verstößt das neue Facebook Javascript SDK nicht gegen die "selbe Ursprungsrichtlinie"?

So wird es sein, www.example.com einschließlich einige Javascript von Facebook, aber wie ich mich erinnere, Dieses Skript gilt als Ursprung von www.example.com und kann keine Daten von facebook.com abrufen, da dies eine Verletzung der "self source policy" darstellt. Ist das nicht richtig? Wenn ja, wie ruft das Skript Daten ab?

+1

Ich dachte, die gleiche Herkunft Politik ist, wenn die HTML-Seite kommt von www.foo.com, und es enthält ein Skript von www.bar.com, dann Datenerfassung mit Javascript ist nur auf www.foo.com aber begrenzt nirgendwo sonst. –

Antwort

0

Ich denke, aber bin mir nicht sicher, dass sie die Iframe-Methode verwenden. Zumindest die Cross-Domain-Empfänger und Xfbml Zeug für Canvas-Apps verwendet das. Grundsätzlich erstellt das Javascript auf Ihrer Seite einen iframe innerhalb der facebook.com Domain. Dieser iframe hat dann die Erlaubnis, mit Facebook alles zu tun, was er braucht. Die Kommunikation zurück mit dem Elternteil kann mit einer von mehreren Methoden erfolgen, zum Beispiel dem URL-Hash. Aber ich bin mir nicht sicher, ob und welche Methode sie für diesen Teil verwenden.

+0

Es ist nicht der iFrame, der das tut. Siehe das zweite Zitat in meiner Antwort. Der iFrame kann weiterhin nicht mit dem Skript auf der übergeordneten Seite interagieren. – David

5

Von hier aus: https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript

Die Same Origin Policy verhindert, dass ein Dokument oder Skript geladen von einer Herkunft von Abrufen oder Festlegen Eigenschaften eines Dokument von einer anderen Herkunft. Diese Richtlinie gibt den gesamten Weg zurück zu Netscape Navigator 2.0.

und erklärte etwas anders hier: http://docs.sun.com/source/816-6409-10/sec.htm

Die Same Origin Policy arbeitet als folgt: Wenn ein Dokument aus einem Ursprung Laden ein Skript aus einer unterschiedlichen Herkunft geladen nicht oder eingestellt bekommt spezifische Eigenschaften bestimmter Browser- und HTML-Objekte in einem Fenster oder Frame (siehe Tabelle 14.2).

Das Facebook-Skript versucht nicht, mit Skript aus Ihrer Domäne zu interagieren oder DOM-Objekte zu lesen. Es wird nur einen eigenen Beitrag zu Facebook machen. Es ruft den Site-Namen ab, nicht durch Interaktion mit Ihrer Seite oder Skript von Ihrer Site, sondern weil das Skript selbst beim Ausfüllen des Formulars generiert wird, um den "Gefällt mir" -Button zu erhalten. Ich registrierte eine Seite mit dem Namen "http://www.bogussite.com" und bekam den Code, den ich auf meiner Website veröffentlichen sollte. Die erste Think in diesem Code war

iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.bogussite.com& 

so wird das Skript deutlich Ihre Website Informationen von hartcodierte URL-Parametern in dem Link zu dem iFrame bekommen.

Die Facebook-Website ist bei weitem nicht allein, wenn Sie Skripts verwenden, die auf ihren Servern gehostet werden. Es gibt viele andere Skripts, die auf diese Weise funktionieren. Für alle Google APIs, z. B. Google Gears, Google Analytics usw., müssen Sie ein Skript verwenden, das auf ihrem Server gehostet wird. Erst letzte Woche, während ich versuchte, herauszufinden, wie man Geolocation für unseren Store-Finder für eine mobilfreundliche Web-App macht, fand ich eine ganze Reihe von Geolocation-Diensten, bei denen man Skripte auf ihren Servern gehostet hatte, anstatt das Skript zu kopieren zu deinem Server.

+1

hm, ich schaue mir die Methode '' an ... wie sie auf example.com erscheinen und Daten von facebook.com abrufen kann. Wenn es die Iframe-Methode ist, ist der Iframe der Domain facebook.com, also kann er nach facebook.com gehen und irgendwelche Daten holen. –

+0

Weil es nicht die Regeln der gleichen Ursprungsrichtlinie verletzt. Es greift nicht auf Skripts von der Hauptseite zu und greift nicht auf DOM-Elemente auf der Hauptseite zu. Es führt einfach einen Post auf einer Seite auf einem anderen Server aus. Die gleiche Herkunftspolitik verhindert dies nicht. (Wenn es DID wäre, gäbe es keinen CSRF-Angriff). Wenn es versuchte, variable Daten von einem Skript auf Ihrer Seite zu lesen und es an Facebook weiterzuleiten, oder von Formularelementen zu lesen und diese Daten an Facebook weiterzuleiten, dann würde es einen Verstoß geben. – David

0

Wenn ich mich erinnere, verwenden sie Skript-Tag-Einfügung. Wenn also ein JS SDK-Aufruf an Facebook gesendet werden muss, fügt er ein <script src="http://graph.facebook.com/whatever?params...&callback=some_function Skript-Tag in das aktuelle Dokument ein. Dann gibt Facebook die Daten im JSON-Format als some_function({...}) zurück, wo sich die tatsächlichen Daten im ... befinden.Dies führt dazu, dass die Funktion some_function im Ursprung von example.com mit Daten von graph.facebook.com aufgerufen wird.

Verwandte Themen