Safari浏览器第三方cookie iframe技巧不再有效?

所以这是“如何获得第三方cookie在Safari上工作”的第十八次报复,但我再次提出要求,因为我认为赛场已经发生了变化,可能在2012年2月之后。获得第三名的标准技巧之一Safari中的第三方cookie如下所示:使用一些JavaScript将POST发送到隐藏的iframe。 它(用来)诱使Safari认为用户与第三方内容进行了交互,然后允许设置cookie。

我认为这个漏洞已经在轻微的丑闻之后被封闭,因为它揭露了谷歌在广告中使用该技巧。 至少,在使用这个技巧时,我完全无法在Safari中设置Cookie。 我发掘了一些随机的网络帖子,声称苹果正在努力弥补这个漏洞,但我还没有找到官方的话。

作为一个后备,我甚至尝试重新设计主要的第三方框架,这样你就必须在内容加载之前点击一个按钮,但即使是这种直接互动水平也不足以融化Safari的冷酷心脏。

那么是否有人知道Safari是否真的关闭了这个漏洞? 如果是这样,是否有其他解决方法(除了在每个请求中手动包含会话ID)?


只想在这里留下一个简单的工作解决方案, 不需要用户交互

正如我在一篇文章中所说:

基本上所有你需要做的就是在top.location上加载你的页面,创建会话并将其重定向回facebook。

将此代码添加到index.php的顶部,并将$page_url设置$page_url您的应用程序的最终选项卡/应用程序URL,您将看到您的应用程序无任何问题。

<?php
    // START SAFARI SESSION FIX
    session_start();
    $page_url = "http://www.facebook.com/pages/.../...?sk=app_...";
    if (isset($_GET["start_session"]))
        die(header("Location:" . $page_url));

    if (!isset($_GET["sid"]))
        die(header("Location:?sid=" . session_id()));
    $sid = session_id();
    if (empty($sid) || $_GET["sid"] != $sid):
?>
   <script>
        top.window.location="?start_session=true";
    </script>
<?php
    endif;
    // END SAFARI SESSION FIX
?>

注意:这是为Facebook制作的,但实际上它可以在任何其他类似情况下使用。


编辑2012年12月20日 - 维护签署的请求:

上面的代码不会维护请求发布数据,并且如果您的应用程序依赖于签名请求,您可以随意尝试以下代码,否则将丢失signed_request:

注意:这仍然正在测试正确,可能不如第一个版本稳定。 使用风险自负/反馈表示赞赏。

(感谢CBroe指出我正确的方向,可以改进解决方案)

// Start Session Fix
session_start();
$page_url = "http://www.facebook.com/pages/.../...?sk=app_...";
if (isset($_GET["start_session"]))
    die(header("Location:" . $page_url));
$sid = session_id();
if (!isset($_GET["sid"]))
{
    if(isset($_POST["signed_request"]))
       $_SESSION["signed_request"] = $_POST["signed_request"];
    die(header("Location:?sid=" . $sid));
}
if (empty($sid) || $_GET["sid"] != $sid)
    die('<script>top.window.location="?start_session=true";</script>');
// End Session Fix

你说你愿意让你的用户在内容加载之前点击一个按钮。 我的解决方案是有一个按钮打开一个新的浏览器窗口。 该窗口为我的域名设置了一个cookie,刷新了首域,然后关闭。

所以你的主要脚本可能看起来像:

<?php if(count($_COOKIE) > 0): ?>
<!--Main Content Stuff-->
<?php else: ?>
<a href="/safari_cookie_fix.php" target="_blank">Click here to load content</a>
<?php endif ?>

然后safari_cookie_fix.php看起来像:

<?php
setcookie("safari_test", "1");
?>
<html>
    <head>
        <title>Safari Fix</title>
        <script type="text/javascript" src="/libraries/prototype.min.js"></script>
    </head>
    <body>
    <script type="text/javascript">
    document.observe('dom:loaded', function(){
        window.opener.location.reload();
        window.close();
    })
    </script>
    This window should close automatically
    </body>
</html>

我使用.htaccess欺骗了Safari:

#http://www.w3.org/P3P/validator.html
<IfModule mod_headers.c>
Header set P3P "policyref="/w3c/p3p.xml", CP="NOI DSP COR NID CUR ADM DEV OUR BUS""
Header set Set-Cookie "test_cookie=1"
</IfModule>

它也停止了为我工作。 我的所有应用程序都在Safari中丢失会话,并重定向到Facebook以外。 由于我急于修复这些应用程序,目前我正在寻找解决方案。 我会及时向大家发布。

编辑(2012-04-06):显然苹果用5.1.4“固定”它。 我相信这是对Google的反应:“执行cookie政策时存在问题。如果Safari中的”阻止Cookies“首选项设置为默认设置”来自第三方和广告商“。http://support.apple.com/kb/HT5190

链接地址: http://www.djcxy.com/p/57463.html

上一篇: Safari 3rd party cookie iframe trick no longer working?

下一篇: How do you set a cookie in a Facebook Tab or Canvas App?