it-swarm.com.de

Facebook JavaScript SDK über HTTPS lädt nicht sichere Objekte

Ich habe eine Facebook-Anwendung, die Facebook Connect.js verwendet.

Ich verwende meine Anwendung über HTTPS. Der gesamte Inhalt der Website wird von https:// bereitgestellt, mit Ausnahme einiger Inhalte, die in Facebooks Connect.js enthalten sein müssen.

Das Problem ist, dass ich Warnmeldungen bekomme, die besagen, dass nicht sichere Elemente auf der Seite vorhanden sind.

Ich habe geprüft, welche Skripte mit Chrome der Registerkarte Entwicklerwerkzeuge/Netzwerk geladen werden, um zu sehen, welche Dateien von wo geladen werden.

Das einzige, was ich sehen kann, das über HTTP und nicht über HTTPS geladen wird, ist eine Datei mit dem Namen http://static.ak.facebook.com/connect/canvas_proxy.php.

Wie kann ich erzwingen, dass diese Datei HTTPS verwendet?

43
paperclip

TL; DR

setzen Sie FB._https auf true, bevor Sie FB.init aufrufen. Wie so:

FB._https = true;
FB.init({
    /* your app id and stuff */
});

Erklärung

Wenn Sie die Minimierung des Facebook JavaScript SDK aufheben, werden Sie feststellen, dass es sich im Grunde genommen um ein Objektliteral mit einer Reihe von Eigenschaften handelt. Eine dieser Eigenschaften ist _https, ein Boolescher Wert. Diese Eigenschaft legt fest, welche URL-Gruppe für API-Anforderungen verwendet werden soll (gespeichert in FB._domain). Es sieht so aus, als ob Facebook für jede Art von API-Anfrage zwei URL-Sätze führt - eine sichere URL und eine nicht sichere URL - und dann mithilfe einer Switch-Funktion namens getDomain() festlegt, welche bei Anfragen verwendet werden soll.

Der Grund, warum das JavaScript SDK Sicherheitswarnungen verursacht, liegt in der Art und Weise, wie die Eigenschaft FB._https definiert ist. So ist es derzeit ab dem 24.08.2011 definiert:

_https: (window.name.indexOf('_fb_https') > -1)

Anscheinend glaubt Facebook, dass es sich um eine sichere App handeln muss, wenn die Eigenschaft window.name_fb_https enthält. Das ist offensichtlich falsch. Der eigentliche Test sollte ungefähr so ​​aussehen:

_https: window.location.protocol == "https:"

Leider ist das SDK nicht Open Source oder sogar gut dokumentiert, so dass ich keine Pull-Anfrage für diese Änderung einreichen kann: P. Kurzfristig, Setzen Sie FB._https manuell auf true, bevor Sie FB.init aufrufen.

54
Ralph Holzmann

Das würde Ihnen also dieselbe Protokollverbindung geben:

FB._https = (window.location.protocol == "https:");
9
sbaechler

Ich bin vor einigen Tagen auf dieses Problem gestoßen. Meine gesamte Anwendung verwendete HTTPS, und mein Problem bestand nur darin, dass Profilbilder über HTTP geladen wurden. Meine schnelle und schmutzige Lösung bestand darin, alle Domänennamen der Profilbilder manuell zu ersetzen. Zum Beispiel,

str_replace('http://profile.ak.fbcdn.net','https://fbcdn-profile-a.akamaihd.net',$user['pic_square']);

Sie müssen überprüfen, welche URL Ihre Profilbilder haben. Ich würde davon ausgehen, dass sie nicht von genau demselben Ort kommen. Sehen Sie sich die URL Ihres eigenen Profilbildes an und ersetzen Sie das, was ich unter https://fbcdn-profile-a.akamaihd.net habe.

Nachdem Sie sich die Facebook-Dokumentation genauer angesehen haben :

Wenn Sie ein Bild über eine sichere Verbindung zurückgeben möchten, können Sie das Argument return_ssl_resources auf 1 setzen: https://graph.facebook.com/4/picture?return_ssl_resources=1 .

Ich habe einen zusätzlichen Parameter mit dem Namen return_ssl_resources gefunden. Wenn er mit true übergeben wird, gibt er Profilbilder mit HTTPS zurück.

$fql = "SELECT uid, name, pic_square FROM user WHERE uid=me()";

$param = array( 'method' => 'fql.query', 'query' => $fql, 'return_ssl_resources'=>1);

$fbuser = $facebook->api($param);

Es funktionierte wie ein Zauber, und ich bekam keine gemischten Sicherheitswarnungen mehr. Ich hoffe das hilft!

8
Lix

In Ergänzung zu Ralph Holzmann und Simon Bächler ist das folgende Problem noch schwieriger, wenn FB ._ https alleine den Trick nicht macht;

FB._https = (window.location.protocol == "https:");
FB.init({
    ...
});
if (FB._https && window == window.parent) {
    if (FB._domain && FB._domain.staticfb && FB._domain.https_staticfb)
        FB._domain.staticfb = FB._domain.https_staticfb;
}

Siehe auch FB.Arbiter.inform () {... FB.getDomain ((d? 'Https _': '') + 'staticfb', true) ...} wobei d = window! = Window.parent && ... Stand vom 2012-Feb-10.

2
Carl Krig

Es sieht aus wie FB._https und wurde ersetzt durch:

FB._secure = (window.location.protocol == "https:");
1

Ich hatte ein ähnliches Problem (fb-Kommentare funktionieren nicht im sicheren Modus). Dies löst es - referenzieren Sie die Javascript-Datei über https:

<script type="text/javascript" src="https://connect.facebook.net/en_US/all.js"></script>

Oder geben Sie das Schema nicht für beide an:

<script type="text/javascript" src="//connect.facebook.net/en_US/all.js"></script>
0
kraigh

Dies scheint durch diesen Facebook-Fehler verursacht zu sein.

Siehe auch dieses forum post .

Dieser Fehler wurde am 3/16 als behoben markiert, aber ich beobachte immer noch Nicht-https-Anfragen an canvas_proxy.php. Hoffentlich wird dies bald behoben sein ...

0
Mirko Froehlich

Wenn Sie auf Ihrer HTML -Seite wie die folgende doc-type-Deklarationen haben, kann der Verweis auf " http://www.w3.org " auch die Inhaltswarnung anzeigen Fehler im Internet Explorer.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
0
Jim Jose