阻止第三方cookie - 解决方法(Facebook应用程序等)

san*_*hez 18 javascript safari facebook actionscript-3 local-shared-object

默认情况下,Mac上的Safari Block cookies设置为From third parties and advertisers.

如果嵌入的swf来自不同的域,它会阻止SharedObject工作.

这个问题并不新鲜: Safari第三方cookie iframe技巧不再有效?

有没有人找到解决方案(除了在每个请求中通过GET/POST参数传递会话ID)?

注意:我无法访问嵌入swf的网站,因此无法更改HTML或放置任何JavaScript等.

san*_*hez 12

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
Run Code Online (Sandbox Code Playgroud)

资料来源:http://www.reizbombardement.de/archives/safari-5-1-4-enforces-cookie-policy

// 2013年7月23日更新

修复此问题的这种糟糕的方法曾经工作到Safari 6.

请参阅下面的@Fabio Antunes和@ncubica评论.

// 2013年7月23日由Fabio Antunes更新

这是我的代码

在目标网页上,我们将简要介绍该应用,并提供一个类似"输入"的按钮.我正在使用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);
});
Run Code Online (Sandbox Code Playgroud)

这将打开一个小窗口,以500 x 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
Run Code Online (Sandbox Code Playgroud)


rca*_*brj 10

Safari 仍会阻止来自顶部窗口中未访问过的域的cookie.

为了解决这个问题,我们在PHP中计算($ _ COOKIES)并将浏览器指向我们域上的页面,该页面的工作就是将浏览器发送回原来的位置.这是一个肮脏的技巧,这意味着一些用户将不必要地被移走,然后回来,但随后,网络充满了肮脏的技巧.

如果您无法top.location.href在域上设置需要设置cookie的页面,或者您无法更改所述域上的页面,那么我可以自信地说您需要使用基于URL的会话.

但是,另一个选项(仍然需要能够在域上创建页面)是请求用户单击您的SWF,然后您可以触发window.open并让URL指向您创建的页面.它需要做的就是成功加载,然后用户(甚至弹出页面本身的JS)可以关闭弹出窗口.然后,您可以设置cookie.


我开发的Facebook应用程序存在于iframe中,这就遇到了这个问题.每个应用程序都必须附带此修复程序.