ssl-通过HTTPS加载非安全项目的Facebook JavaScript SDK

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

我正在通过HTTPS运行我的应用程序。 该网站上的所有内容均从http://static.ak.facebook.com/connect/canvas_proxy.php交付,但某些内容必须包含在Facebook的Connect.js

问题是我收到警告消息,指出页面内有不安全的物品。

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

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

如何强制此文件使用HTTPS?

8个解决方案
54 votes

TL; DR

在致电FB.init之前将FB._https设置为true。像这样:

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

说明

如果您取消Facebook Facebook SDK的最小化,您将看到它基本上是带有许多属性的对象文字。 这些属性之一是FB._https,它是一个布尔值。 此属性确定在发出API请求时要使用的URL集(存储在true中)。 似乎Facebook为每种类型的API请求保留了两组URL(安全URL和非安全URL),然后使用名为FB.init的切换功能来确定在发出请求时使用哪个URL。

JavaScript SDK引起安全警告的原因是由于FB._https属性的定义方式。 自2011年8月24日起,当前的定义如下:

FB._https

显然,Facebook认为,如果FB._https属性中包含true,则它一定是安全的应用程序。 这显然是不正确的。 真正的测试应与此类似:

FB._https

不幸的是,SDK不是开源的,甚至没有充分的文档说明,因此我无法提交对此更改:P的请求请求。 在短期内,在致电FB.init之前手动将FB._https设置为true应该可以解决问题。

Ralph Holzmann answered 2020-08-06T01:02:21Z
9 votes

因此,这将为您提供相同的协议链接:

FB._https = (window.location.protocol == "https:");
sbaechler answered 2020-08-06T01:02:41Z
8 votes

我几天前遇到了这个问题。 我的整个应用程序都使用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);

它像一种魅力一样工作,我不再收到混合的安全警告。 我希望这有帮助!

Lix answered 2020-08-06T01:03:24Z
2 votes

除了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日。

Carl Krig answered 2020-08-06T01:03:49Z
1 votes

看起来FB._https已替换为:

FB._secure = (window.location.protocol == "https:");
Stephane Brillant answered 2020-08-06T01:04:08Z
0 votes

这似乎是由这个Facebook错误引起的。

另请参阅此论坛帖子。

该错误在3/16上被标记为已解决,但我仍然观察到canvas_proxy.php的非https请求。 希望这会很快解决。

Mirko Froehlich answered 2020-08-06T01:04:37Z
0 votes

在一个旁注中,如果您在HTML页面上有如下所示的文档类型声明,则对[[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">
Jim Jose answered 2020-08-06T01:04:58Z
0 votes

我遇到了类似的问题(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>
kraigh answered 2020-08-06T01:05:22Z
translate from https://stackoverflow.com:/questions/5212016/facebook-javascript-sdk-over-https-loading-non-secure-items