第三派对甜饼如果花招不再起作用了?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (22)

这是“我如何在Safari获得第三份派对曲奇”的第一个复仇问题,但我再次提出,因为我认为竞争环境已经改变,也许是在2012年2月之后。在Safari中获得第三派对cookie的标准技巧如下:使用一些javascript将其发布到隐藏的iframe。它(过去)欺骗Safari,使其认为用户已经与第三方内容交互,因此允许设置cookie。

思考这一漏洞在轻微丑闻发生后被封堵,在丑闻曝光后,谷歌(Google)在其广告中使用了这种伎俩。至少,在使用这个技巧时,我完全无法在Safari中设置cookie。我在网上发现了一些随意的帖子,声称苹果正在努力填补漏洞,但我没有找到任何官方消息。

作为退步,我甚至尝试重新设计主要的第三方框架,以便在内容加载之前必须单击一个按钮,但是即使是这样的直接交互级别也不足以融化Safari冰冷的心。

那么,有没有人确切地知道Safari是否确实堵住了这个漏洞?如果是这样的话,是否有其他解决办法(除了在每个请求中手动包含一个会话ID之外)?

提问于
用户回答回答于

让用户在加载内容之前单击一个按钮。我的解决方案是让一个按钮打开一个新的浏览器窗口。该窗口为我的域设置一个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 ?>

然后是狩猎_小甜饼_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>
用户回答回答于

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

基本上,所需要做的就是将页面加载到top.Location,创建会话并将其重定向回Facebook。

将此代码添加到index.php并设定$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做的,但实际上它在任何其他类似的情况下都是可行的。

编辑20-2012年12月-维护签名请求:

上面的代码不维护请求的POST数据,可能会松开已签名的_请求,如果应用程序依赖于签名的请求,请随意尝试以下代码:

// 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

扫码关注云+社区