web-dev-qa-db-ja.com

安全でないアイテムを読み込むHTTPS経由のFacebook JavaScript SDK

Facebook Connect.js を使用するFacebookアプリケーションがあります。

アプリケーションをHTTPSで実行しています。サイトのすべてのコンテンツはhttps://から配信されますが、FacebookのConnect.jsに含める必要がある一部のコンテンツは例外です

問題は、ページ内に安全でないアイテムがあるという警告メッセージが表示されることです。

Chrome の[開発者ツール]/[ネットワーク]タブを使用して、どのスクリプトがロードされているかを確認し、どのファイルがどこからロードされているかを確認しました。

HTTPS経由ではなくHTTP経由でロードされていることがわかるのは、http://static.ak.facebook.com/connect/canvas_proxy.phpというファイルだけです。

このファイルでHTTPSを使用するにはどうすればよいですか?

43
paperclip

TL; DR

_FB._https_を呼び出す前に、_FB.init_をtrueに設定します。そのようです:

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

説明

Facebook JavaScript SDKをunminifyすると、基本的には一連のプロパティを持つオブジェクトリテラルが表示されます。これらのプロパティの1つは__https_であり、これはブール値です。このプロパティは、APIリクエストを行うときに使用するURLのセット(_FB._domain_に格納)を決定します。 FacebookがAPIリクエストのタイプごとに2セットのURL(セキュアURLと非セキュアURL)を保持しているように見え、次にgetDomain()と呼ばれるスイッチ関数を使用して、リクエストを作成するときにどちらを使用するかを決定します。

JavaScript SDKがセキュリティ警告を引き起こす理由は、_FB._https_プロパティの定義方法にあります。これは、2011年8月24日の時点で現在定義されている方法です。

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

どうやらFacebookは、_window.name_プロパティに__fb_https_が含まれている場合、セキュリティで保護されたアプリである必要があると考えています。これは明らかに正しくありません。実際のテストは次のようになります。

__https: window.location.protocol == "https:"_

残念ながら、SDKはオープンソースではなく、十分に文書化されていないため、この変更のプルリクエストを送信できません:P。短期的には _FB._https_を呼び出す前に__FB.init_を手動でtrueに設定すると、うまくいくはずです。

54
Ralph Holzmann

だからこれはあなたに同じプロトコルリンクを与えるでしょう:

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

数日前にこの問題に遭遇しました。私のアプリケーション全体がHTTPSを使用していて、問題はHTTP経由で読み込まれるプロフィール写真のみでした...私のすばやくて汚い修正は、すべてのプロフィール写真のドメイン名を手動で置き換えることでした。例えば、

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

プロフィール写真のURLを確認する必要があります。私はそれらが全く同じ場所から来ているのではないと思います。自分のプロフィール写真のURLを表示し、https://fbcdn-profile-a.akamaihd.netにあるものに置き換えます。

Facebookドキュメント をよく見た後:

安全な接続を介して画像を返す必要がある場合は、return_ssl_resources引数を1に設定できます https://graph.facebook.com/4/picture?return_ssl_resources=1

return_ssl_resourcesという追加のパラメーターが見つかりました。trueを指定して渡すと、HTTPSを使用してプロフィール写真が返されます。

$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);

それは魅力のように機能し、混合セキュリティ警告を受け取るのをやめました。これが役に立てば幸いです!

8
Lix

Ralph HolzmannとSimonBächlerに加えて、以下はFB ._httpsだけではうまくいかない場合のさらに難しい修正です。

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;
}

FB.Arbiter.inform(){... FB.getDomain((d? 'https _': '')+ 'staticfb'、true)...}も参照してください。ここで、d = window!= window.parent && ... 2012年2月10日現在。

2
Carl Krig

FB._httpsに置き換えられたように見えます:

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

私は同様の問題を抱えていました(fbコメントがセキュアモードで機能していません)。これはそれを解決します-https経由でjavascriptファイルを参照するだけです:

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

または、両方で機能するスキームを指定しないでください。

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

これは Facebookバグ が原因であるようです。

こちらもご覧ください フォーラム投稿

そのバグは3/16に解決済みとしてマークされましたが、まだcanvas_proxy.phpへの非httpsリクエストを監視しています。うまくいけば、これはすぐに実際に修正されるでしょう...

0
Mirko Froehlich

補足として、次のように [〜#〜] html [〜#〜] ページにdoc-type宣言がある場合、「 http:// www。 w3.org "は、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