Safari и php сессии не работают в Facebook iframe - PullRequest
7 голосов
/ 03 апреля 2012

У меня проблема с тем, чтобы приложение Facebook работало на Safari.

Проблема связана с переменными сеанса PHP.

Мне известно, что в Safari есть проблема, связанная смеждоменные сессии (внутри iframe), и я нашел около 2 типов решений:

  1. Настройка заголовка p3p: я пробовал много заголовков p3p, найденных вокруг, но ни один из них не работал [например:header('P3P: CP="NOI ADM DEV COM NAV OUR STP"');].
  2. Отправка сообщения в iframe с использованием javascript.Это создает взаимодействие и сессии должны работать.Но дело в том, что я не контролирую контейнер iframe, как это facebook.

Кто-нибудь знает альтернативное решение?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 12 августа 2013

Я опоздал на это, но это может помочь кому-то другому разобраться в этой проблеме.

Единственный метод, который я мог сделать, - это обнаружить сафари внутри моего iframe и на мгновение перенаправить на другую страницу, где я мог бы установить свой сеансовый файл cookie, а затем перенаправить обратно.

<?php
// sort out ie with the below header
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
session_start();
$_SESSION = array();

// if Safari and no cookies have been set yet, take me to another page to set a session cookie
if (strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') && !strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome')) {
    if (count($_COOKIE) === 0) {
     echo '<script> 
     top.location = "http://www.domain.com/setcookie.php";
     </script>';
    }
}
?>

Затем из setcookie.php

<?php
//inside setcookie.php
header('P3P: CP="CAO PSA OUR"');
session_start();
$_SESSION = array();

echo 
'<script>
top.location = "http://www.backtooriginaldomain.com"; 
</script>';
?>

немного неубедительно, но работает и не мешает другим браузерам. Другой способ - использовать всплывающее окно, хотя в моем сафари это было заблокировано по умолчанию.

3 голосов
/ 03 апреля 2012

РЕДАКТИРОВАТЬ: Подтверждено, этот обходной путь больше не работает в Safari 5.1 на Mac. Обсуждается здесь: Safari сторонний cookie-трюк iframe больше не работает?

Я не знаю, каков ваш вариант использования, но в нашем приложении у нас есть экран приветствия с кнопкой «Разрешить доступ», которая открывает диалог разрешений. Когда пользователь нажимает «Разрешить доступ», я использую его, чтобы открыть новое окно, которое устанавливает сеанс и немедленно закрывается (это было предложено в вопросе, связанном выше). После того, как пользователь разрешил доступ, вы можете просто перезагрузить страницу? В нашем случае это не требуется, так как вся связь с сервером осуществляется с помощью AJAX.


Я использую второе решение, и у меня нет проблем с ним, вот мой код (с использованием jQuery):

/**
 * Hack for Safari cross-domain cookies. See: 
 * http://anantgarg.com/2010/02/18/cross-domain-cookies-in-safari/
 */

$(document).ready( function() {

    var isSafari = (/Safari/.test(navigator.userAgent));

    if (isSafari) {
        var iframe = $( "<iframe />" );
        iframe.attr( "id", "cookieframe" );
        iframe.attr( "name", "cookieframe" );
        iframe.hide();

        var form = $( "<form />" );
        form.attr( "id", "cookieform" );
        form.attr( "target", "cookieframe" );
        form.attr( "enctype", "application/x-www-form-urlencoded" );
        form.attr( "action", "startsession.php" );
        form.attr( "method", "post" );

        $("body").append( iframe );
        $("body").append( form );
        form.submit();
    }

} );

В startsession.php я только начинаю сеанс:

<?php session_start();
0 голосов
/ 28 октября 2014

далеко не самое лучшее решение, но вам не нужны лишние страницы Поместите Решение в самую первую позицию на своей странице, чтобы вы видели только мерцание белого цвета.

<?php
if (isset($_GET['safarifix'])) {
    session_start();
    echo '<script type="text/javascript">top.location = \''.$_GET['safarifix'].'\'</script>';
    exit();
}

if (!isset($_COOKIE, $_COOKIE['PHPSESSID'])) {
    header('P3P: CP="CAO PSA OUR"');
    echo '<script type="text/javascript">top.location = document.URL + "?safarifix=" + encodeURIComponent(document.referrer)</script>';
    exit();
}
?>

отправьте ваш ссылающийся URL на страницу, где вы действительно делаете свои вещи. ничего дополнительного не нужно. затем вернитесь к странице, на которой вы были в первую очередь.

...