【问题标题】:block third party cookies - workaround (facebook apps etc)阻止第三方 cookie - 解决方法(Facebook 应用程序等)
【发布时间】:2015-01-11 05:26:31
【问题描述】:

Mac 上的 Safari 默认将 Block cookies 设置为 From third parties and advertisers

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

这个问题并不新鲜: Safari 3rd party cookie iframe trick no longer working?

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

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

【问题讨论】:

    标签: javascript facebook actionscript-3 safari local-shared-object


    【解决方案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

    //2013 年 7 月 23 日更新

    这种解决此问题的糟糕方法在 Safari 6 之前一直有效。

    请参阅下面的@Fabio Antunes 和@ncubica cmets。

    //2013 年 7 月 23 日更新,作者 Fabio Antunes

    这是我的代码

    在登录页面上,我们将有一个关于应用程序的简要说明和一个类似“进入”的按钮。我正在使用 jquery 来简化此过程,为单击事件创建一个侦听器,我将只放置 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 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
    

    【讨论】:

    • 这不会触发弹出窗口拦截器,因为用户没有点击来启动它吗?此外,您正在打开一个新窗口,其中没有任何内容,对我来说这似乎不是一个可接受的生产解决方案。
    • 目前,这是唯一我可以让事情可靠地工作的方法。非常糟糕的解决方法,因为 Safari 也阻止了“弹出窗口”。 @Abadaba 如果您遇到更好的解决方案,请分享。仅供参考:Facebook 应用程序
    • 谢谢,我解决了同样的问题 :)
    • Mac 上 Safari 6.0.5 的问题仍然存在,我们该如何解决?
    • 我添加了一些代码,简要说明了我用来避开这个小障碍的方法
    【解决方案2】:

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

    为了解决这个问题,我们在 PHP 中计算 ($_COOKIES) 并将浏览器定向到我们域中的一个页面,该页面的工作是将浏览器简单地发送回它的来源。这是一个肮脏的把戏,这意味着一些用户会不必要地离开然后又回来,但是,网络上充满了肮脏的把戏。

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

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


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

    【讨论】:

    • 能否请您解释一下,但对于 java facebook 游戏应用程序解决方法?
    【解决方案3】:

    根据最近的经验,我可以说这不是 Mac 上的 Safari 的问题,我也从未遇到过问题。

    您提到该设置阻止来自第三方的 cookie:SharedObject 存储永远不会来自第三方,而是来自您正在访问的站点(第一方?)。所以我认为这永远不会成为问题。

    使用 Flash Player 设置面板,用户可以禁用SharedObject(或限制存储空间量)。所以一般来说,你的应用应该处理SharedObject不可用的情况。

    但是,我认为大多数用户不知道SharedObject,他们可以禁用它。

    【讨论】:

    • 我刚刚将设置设置为阻止第三方 cookie (Win7 Safari),但 SharedObject 无法正常工作。我会得到一些痕迹并很快更新这篇文章。
    • 有趣...该设置不是默认设置,但对吗?此外,阻止访问共享对象的另一件事是“私人”或“隐身”浏览(浏览器仅为该特定会话保留 cookie)。 Chrome 可以选择执行此操作。
    • 我应该在我自己的浏览器(Safari 5.1.7、Mac)中检查这一点:在“首选项”的“隐私”选项卡上,“阻止 cookie”设置被设置为阻止“来自 3rd 方的 cookie”和广告商”。这是默认值(我认为我从未更改过它)。但在我的情况下,访问 SharedObject 在阻止 3rd 方 cookie 时工作得很好。
    • 是的,编辑问题/主题不是一个坏主意。听起来您的替代想法(通过 cookie 保存数据)也行不通。唯一能想到的其他选择是将数据保存在服务器上,或者检测代码中的问题并通知用户无法保存数据。
    【解决方案4】:

    您可能需要使用跨域策略文件才能使 swf 正常工作。

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

    【讨论】:

      【解决方案5】:

      我已经通过这种方式解决了,但最好使用 HTML5 localstorage 并使 web 服务变得安静,因为在 server2 中保存会话变量会使您的应用程序无法很好地扩展。 这是我用来解决第 3 方 cookie 问题的代码。基本上 server1 的客人首先去 server2 以获取“硬币:D”,然后他突然回到 server1。这样,server2 的会话变量在所有导航中都是可用的。 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);
      ?>
      

      附: window.open 被视为一种弹出窗口,因此您可能会遇到广告拦截器或浏览器设置的问题。

      【讨论】:

        【解决方案6】:

        只是为 safari.xxx 页面添加一种不带 setTimeout 和/或 jquery 的更简洁的方式。适用于最新的 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>
        

        在我的情况下,弹出窗口不是问题,因为它是由用户单击启动的。

        【讨论】:

          猜你喜欢
          • 2011-12-15
          • 2020-06-05
          • 1970-01-01
          • 2018-10-06
          • 1970-01-01
          • 2020-04-25
          • 2011-01-19
          • 2010-10-11
          • 2014-11-14
          相关资源
          最近更新 更多