Facebook JavaScript SDK over HTTPS加载非安全项目

时间:2011-03-06 17:13:20

标签: facebook ssl https facebook-javascript-sdk

我有一个使用Facebook Connect.js的Facebook应用程序。

我正在通过HTTPS运行我的应用程序。网站上的所有内容均来自https://,但Facebook必须包含的内容除外Connect.js

问题在于我收到警告消息,指出页面中存在非安全项目。

我已经使用Chrome的开发者工具/网络标签检查了正在加载的脚本,以查看正在加载的文件以及从哪里加载。

我唯一可以看到的是通过HTTP而不是通过HTTPS加载的文件名为http://static.ak.facebook.com/connect/canvas_proxy.php

如何强制此文件使用HTTPS?

8 个答案:

答案 0 :(得分:54)

<强> TL; DR

在调用FB._https之前,

true设置为FB.init。像这样:

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

<强>解释

如果你解开Facebook JavaScript SDK,你会发现它基本上是一个带有一堆属性的对象文字。其中一个属性是_https,它是一个布尔值。此属性确定在发出API请求时要使用哪些URL(存储在FB._domain中)。似乎Facebook为每种类型的API请求保留两组URL - 安全URL和非安全URL - 然后使用名为getDomain()的开关函数来确定在发出请求时使用哪种URL。 / p>

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之前手动设置trueFB.init应该可以解决问题。

答案 1 :(得分:9)

所以这会给你相同的协议链接:

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

答案 2 :(得分:8)

我几天前遇到过这个问题。我的整个应用程序都使用HTTPS,我的问题只是通过HTTP加载的个人资料图片...我的快速和肮脏的修复是手动替换所有个人资料图片的域名。例如,

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

您必须检查并查看个人资料图片的网址。我假设他们不是来自完全相同的地方。查看您自己的个人资料图片的网址,并替换我在https://fbcdn-profile-a.akamaihd.net

的内容

Facebook documentation

之后更加努力
  

如果您需要通过安全连接返回图片,可以将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);

它就像一个魅力,我停止了混合安全警告。我希望这有帮助!

答案 3 :(得分:2)

除了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&amp; ;&amp; ...截至2012年2月10日。

答案 4 :(得分:1)

看起来FB._https已被替换为:

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

答案 5 :(得分:0)

这似乎是由Facebook bug引起的。

另见forum post

该错误已在3/16标记为已解决,但我仍在观察对canvas_proxy.php的非https请求。希望这很快就能确定......

答案 6 :(得分:0)

在旁注中,如果您在HTML页面上有如下所示的文档类型声明,则对“http://www.w3.org”的引用也会在Internet Explorer中显示内容警告错误。< / p>

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

答案 7 :(得分:0)

我遇到了类似的问题(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>