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

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

Он останавливает работу SharedObject, если встроенный SWF-файл находится в другом домене.

Эта проблема не нова: трюк Safari с файлами cookie iframe больше не работает?

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

ПРИМЕЧАНИЕ. У меня нет доступа к сайту, на котором встроен SWF, поэтому нет способа изменить этот HTML-код, добавить JavaScript и т. Д.

6 ответов

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 года Фабио Антунес

Вот мой код

На целевой странице у нас будет краткое описание приложения и кнопка с надписью "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

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

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

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

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


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

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

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

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

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

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

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

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

<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);
?>

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

Просто добавьте более чистый способ без 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>

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

Другие вопросы по тегам