it-swarm.com.ru

Facebook JavaScript SDK через HTTPS загрузка незащищенных элементов

У меня есть приложение Facebook, которое использует Facebook Connect.js .

Я запускаю свое приложение через HTTPS. Весь контент на сайте поставляется с https://, за исключением некоторого контента, который должен быть включен в Connect.js Facebook

Проблема в том, что я получаю предупреждающие сообщения о том, что на странице есть незащищенные элементы.

Я проверил, какие скрипты загружаются, с помощью Chrome вкладки Инструменты разработчика/Сеть, чтобы увидеть, какие файлы загружаются и откуда.

Единственное, что я вижу, загружается через HTTP, а не через HTTPS, это файл с именем http://static.ak.facebook.com/connect/canvas_proxy.php.

Как я могу заставить этот файл использовать HTTPS?

43
paperclip

TL; DR

установите FB._https в true перед вызовом FB.init. Вот так:

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

Объяснение

Если вы унифицируете Facebook JavaScript SDK, вы увидите, что это в основном объектный литерал со множеством свойств. Одним из этих свойств является _https, который является логическим значением. Это свойство определяет, какой набор URL использовать (хранится в FB._domain) при выполнении запросов API. Похоже, что Facebook сохраняет два набора URL-адресов для каждого типа запроса API - безопасный и незащищенный URL-адрес, а затем использует функцию переключателя getDomain(), чтобы определить, какой из них использовать при выполнении запросов.

Причина, по которой SDK JavaScript вызывает предупреждения безопасности, связана со способом определения свойства 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 в true вручную перед вызовом FB.init должна помочь.

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

Если добавить к Ральфу Хольцману и Саймону Бехлеру, то следующее исправление еще сложнее для случая, когда 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-февраль-10.

2
Carl Krig

Похоже, что FB._https был заменен на:

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

У меня была похожая проблема (комментарии fb не работают в безопасном режиме). Это решает проблему - просто обратитесь к файлу javascript через https:

<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, но я все еще наблюдаю не-https запросы к canvas_proxy.php. Надеюсь, это будет исправлено очень скоро ...

0
Mirko Froehlich

На заметке, если на вашей странице 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">
0
Jim Jose