Safari сторонний cookie-трюк iframe больше не работает? - PullRequest
132 голосов
/ 29 марта 2012

Итак, это уже десятый отомстивший вопрос «как мне заставить сторонние куки работать в Safari», но я спрашиваю снова, потому что думаю, что игровое поле изменилось, возможно, после февраля 2012 года. Один из стандартных приемов Чтобы получить сторонние файлы cookie в Safari, нужно было сделать следующее: использовать Javascript для отправки в скрытый iframe. Он (раньше) обманывал Safari, думая, что пользователь взаимодействовал с контентом третьих лиц, и поэтому позволял устанавливать файлы cookie.

Я думаю эта лазейка была закрыта в связи с легким скандалом, когда выяснилось, что Google использовал этот трюк со своими объявлениями. По крайней мере, при использовании этого трюка мне не удалось установить файлы cookie в Safari. Я обнаружил несколько случайных сообщений в Интернете, в которых утверждалось, что Apple работает над закрытием лазейки, но я не нашел ни одного официального слова.

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

Так кто-нибудь наверняка знает, действительно ли Safari закрыл эту лазейку? Если да, есть ли другие обходные пути (кроме ручного включения идентификатора сеанса в каждый запрос)?

Ответы [ 19 ]

1 голос
/ 16 сентября 2012

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

http://developsocialapps.com/foundations-of-a-facebook-app-framework/

 if (isset($_GET['setdefaultcookie'])) {
        // top level page, set default cookie then redirect back to canvas page
        setcookie ('default',"1",0,"/");
        $url = substr($_SERVER['REQUEST_URI'],strrpos($_SERVER['REQUEST_URI'],"/")+1);
        $url = str_replace("setdefaultcookie","defaultcookieset",$url);
        $url = $facebookapp->getCanvasUrl($url);
        echo "<html>\n<body>\n<script>\ntop.location.href='".$url."';\n</script></body></html>";
        exit();
    } else if ((!isset($_COOKIE['default'])) && (!isset($_GET['defaultcookieset']))) {
        // no default cookie, so we need to redirect to top level and set
        $url = $_SERVER['REQUEST_URI'];
        if (strpos($url,"?") === false) $url .= "?";
        else $url .= "&";
        $url .= "setdefaultcookie=1";
        echo "<html>\n<body>\n<script>\ntop.location.href='".$url."';\n</script></body></html>";
        exit();
    }
1 голос
/ 27 августа 2015

Я нашел идеальный ответ на это, все благодаря парню по имени Аллан, который заслуживает всяческих похвал здесь.(http://www.allannienhuis.com/archives/2013/11/03/blocked-3rd-party-session-cookies-in-iframes/)

Его решение простое и понятное.

На сервере содержимого iframe (домен 2) добавьте файл с именем startsession.php в корневой каталог.уровень домена, который содержит:

<?php
// startsession.php
session_start();
$_SESSION['ensure_session'] = true;
die(header('location: '.$_GET['return']));

Теперь на веб-сайте верхнего уровня, содержащем iframe (домен1), вызов страницы, содержащей iframe, должен выглядеть следующим образом:

<a href="https://domain2/startsession.php?return=http://domain1/pageWithiFrame.html">page with iFrame</a>

И этоit! Simples:)

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

1 голос
/ 25 июля 2014

Немного более простая версия в PHP того, что опубликовали другие:

if (!isset($_COOKIE, $_COOKIE['PHPSESSID'])) {
    print '<script>top.window.location="https://example.com/?start_session=true";</script>';
    exit();
}

if (isset($_GET['start_session'])) {
    header("Location: https://apps.facebook.com/YOUR_APP_ID/");
    exit();
}
1 голос
/ 05 апреля 2012

Google на самом деле выпустил кота из сумки.Некоторое время они использовали его для доступа к файлам cookie отслеживания.Это было почти сразу исправлено Apple = \

original Wall Street Journal сообщение

0 голосов
/ 21 августа 2015

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

0 голосов
/ 06 апреля 2012

Вы можете решить эту проблему, добавив заголовок в качестве политики p3p. У меня была такая же проблема в сафари, поэтому после добавления заголовка поверх файлов моя проблема была решена.

<?php
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
?>
0 голосов
/ 08 марта 2014

Я использовал модифицированный (добавил параметр sign_request к ссылке) трюк Whiteagle, и он работал нормально для сафари, но IE постоянно обновляет страницу в этом случае.Таким образом, мое решение для сафари и Internet Explorer:

$fbapplink = 'https://apps.facebook.com/[appnamespace]/';
$isms = stripos($_SERVER['HTTP_USER_AGENT'], 'msie') !== false;

// safari fix
if(! $isms  && !isset($_SESSION['signed_request'])) {

    if (isset($_GET["start_session"])) {
        $_SESSION['signed_request'] = $_GET['signed_request'];
        die(header("Location:" . $fbapplink ));

    }
    if (!isset($_GET["sid"])) {
        die(header("Location:?sid=" . session_id() . '&signed_request='.$_REQUEST['signed_request']));
    }
    $sid = session_id();
    if (empty($sid) || $_GET["sid"] != $sid) {
    ?>
    <script>
        top.window.location="?start_session=true";
    </script>
    <?php
    exit;
    }
}

// IE fix
header('P3P: CP="CAO PSA OUR"');
header('P3P: CP="HONK"');


.. later in the code

$sr = $_REQUEST['signed_request'];
if($sr) {
        $_SESSION['signed_request'] = $sr;
} else {
        $sr = $_SESSION['signed_request'];
}
0 голосов
/ 02 октября 2012

Недавно я столкнулся с той же проблемой в Safari.Решение, которое я понял, основано на HTML5 API локального хранилища.Используя локальное хранилище, вы можете эмулировать куки.

Вот мой пост в блоге с подробностями: http://log.scalemotion.com/2012/10/how-to-trick-safari-and-set-3rd-party.html

0 голосов
/ 25 января 2013

Я решил избавиться от переменной $_SESSION все вместе и написал обертку вокруг memcache для имитации сеанса.

Проверка https://github.com/manpreetssethi/utils/blob/master/Session_manager.php

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

Примечание. Это не будет работать при приватном просмотре в Safari, поскольку session_id сбрасываетсякаждый раз, когда страница перезагружается.(Глупое Сафари)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...