Подтвердить что ты не робот

Блокировать сторонние файлы cookie - обходной путь (приложения для facebook и т.д.)

Safari на Mac по умолчанию имеет Block cookies значение From third parties and advertisers.

Он останавливает работу SharedObject, если встроенный swf из другого домена.

Эта проблема не нова: Safari 3rd party cookie iframe trick больше не работает?

Кто-нибудь нашел решение (другое, передающее идентификатор сеанса через параметры GET/POST в каждом запросе)?

Примечание: У меня нет доступа к сайту, который встраивает swf, поэтому нет способа изменить этот HTML-код или поставить любой JavaScript и т.д.

4b9b3361

Ответ 1

function setCookie(){
   if ( navigator.userAgent.indexOf('Safari') != -1 &&
        navigator.userAgent.indexOf('Chrome') == -1 ){
      window.open('safari.php','','width=200,height=100' );
   }
}

// then we set the cookie in safari.php

Источник: http://www.reizbombardement.de/archives/safari-5-1-4-enforces-cookie-policy

//ОБНОВЛЕНИЕ 23 июля 2013

Этот дерьмовый способ исправления этой проблемы использовался до Safari 6.

См. комментарии @Fabio Antunes и @ncubica ниже.

//ОБНОВЛЕНИЕ 23 июля 2013 года от Fabio Antunes

Здесь мой код

На целевой странице мы дадим краткое описание приложения и кнопку с надписью "enter". Я использую jquery, чтобы упростить этот процесс, создав слушателя для события click, я просто поставлю код javascript, так как я предполагаю, что у вас уже есть остальная часть html-кода для целевой страницы:

$(document).on("click", "#bt-landing", function(){
var left = (screen.width/2)-(500/2);
            var top = (screen.height/2)-(250/2);
            window.open('URL_FOR_THE_PHP_THAT_WILL_CREATE_THE_SESSION', '_blank', 'width=500,height=250,toolbar=0,location=0,menubar=0, top='+top+', left='+left);
});

Это вы откроете небольшое окно размером 500 х 250 пикселей, расположенное на вашем экране.

Код, который у меня есть для маленького окна, таков:

<?php setcookie("safari_cookie", "1");?>
    <html>
        <head>
            <meta charset="utf-8">
            <title>THE NAME OF YOUR APP OR SOMETHING THAT THE USER WE'LL READ AND ASSUME THAT THIS SMALL WINDOW IS RELIABLE</title>
        </head>
        <body>
        <script type="text/javascript">
        $(document).ready(function(){
           setTimeout(function(){window.close()},1000);
        })
        </script>
        </body>
    </html

Ответ 2

Safari по-прежнему блокирует файлы cookie из доменов, которые он не посещал в верхнем окне.

Чтобы обойти это, мы подсчитываем ($ _ COOKIES) в PHP и направляем браузер на страницу в нашем домене, задачей которой является просто отправить браузер обратно туда, откуда он появился. Это грязный трюк, который означает, что некоторые пользователи будут излишне убираться, а затем обратно, но тогда сеть полна грязных трюков.

Если вы не можете установить top.location.href на страницу в домене, для которой необходимо установить файлы cookie или вы не можете изменить страницу на указанном домене, я могу с уверенностью сказать, что вам нужно будет использовать сеансы на основе URL.

Однако альтернативный вариант (который по-прежнему требует возможности создать страницу в домене) заключается в том, чтобы запросить, чтобы пользователь нажимал на ваш SWF, вы можете запустить window.open и указать URL-адрес на созданную вами страницу, Все, что нужно сделать, это загрузить успешно, тогда пользователь (или даже JS на самой всплывающей странице) может закрыть всплывающее окно. Затем вы можете установить файлы cookie.


Я разрабатываю приложения для Facebook, которые живут внутри iframe, которые страдают этой проблемой. Каждое приложение должно быть отправлено с этим исправлением.

Ответ 3

С самого недавнего опыта я могу сказать, что это не проблема с Safari на Mac, и я никогда не испытывал его как проблему.

Вы упомянули, что настройка блокирует файлы cookie от сторонних сторон: хранилище SharedObject никогда не принадлежит третьей стороне, это с сайта, который вы посещаете (1-я сторона?). Поэтому я не думаю, что это будет проблемой.

Используя панель настроек проигрывателя Flash Player, пользователь может отключить SharedObject (или ограничить объем пространства для хранения). В общем, ваше приложение должно обрабатывать случай, когда SharedObject недоступен.

Однако, я думаю, большинство пользователей не знают о SharedObject и что они могут его отключить.

Ответ 4

Возможно, вам понадобится использовать файл политики междоменной политики для корректной работы swf.

http://kb2.adobe.com/cps/142/tn_14213.html

Ответ 5

Я решил таким образом, но лучше использовать HTML5 localstorage и сделать webservices спокойным, потому что сохранение переменных сеанса на сервере2 делает ваше приложение недостаточно масштабируемым. Здесь код, который я использовал для решения проблемы стороннего cookie. В основном гости сервера1 идут сначала на сервер2, чтобы взять "монету: D", и вдруг он возвращается к серверу1. Таким образом, переменные сеанса сервера2 доступны во всей навигации. www.yourserver.com/index.html страница

<script src="js/jquery.cookie.js" type="text/javascript"></script>
<script src="js/mobile-detect.js" type="text/javascript"></script>
<script>
var md = new MobileDetect(window.navigator.userAgent);
if (md.userAgent()=='Safari') {
    var firstsafariuser = $.cookie('safari-user');
    if (firstsafariuser != 'true') {
        $.cookie('safari-user', true);
        location.href='http://www.yourserver2.com/coin.php?frompage='
        +location.href.replace(location.hash,"")+'&hashtags='+location.hash.substr(1);
    }
}
</script>

www.yourserver2.com/coin.php

<?php
session_start(); 
if (isset($_GET["frompage"])&&$_GET["frompage"]!=null){
    $url=$_GET["frompage"];
} else {
    $url='http://www.yourserver.com';
}
if (isset($_GET["hashtags"])&&$_GET["hashtags"]!=null){
    $hash='#'.$_GET["hashtags"];
} else {
    $hash='';
}
header('Location:'.$url.$hash);
?>

P.S. window.open видны как всплывающее окно, поэтому у вас могут быть проблемы с рекламными блоками или настройками браузера.

Ответ 6

Просто добавьте более чистый путь без setTimeout и jQuery для страницы safari.xxx. Работает отлично с новейшими ios (8.1.2), я знаю, что для 8.1.0 была ошибка, когда окно/вкладка не закрывалось.

Вот код:

<%
request.getSession(true); //or anyway to set the cookie depending on your language (jsp here)
%>

<script type="text/javascript">
    window.addEventListener("load", window.close);
</script>

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