javascript - Safari 第 3 方 cookie iframe 技巧不再有效?

标签 javascript facebook iframe safari

所以这是“我如何让第 3 方 cookie 在 Safari 中工作”问题的第 10 次报复,但我再次提问是因为我认为竞争环境已经改变,也许是在 2012 年 2 月之后。标准技巧之一在 Safari 中获取第三方 cookie 如下:使用一些 javascript 发布到 Conceal 的 iframe。它(曾经)诱使 Safari 认为用户与第三方内容进行了交互,然后允许设置 cookie。

认为这个漏洞在轻微的丑闻之后已经被堵上了,在丑闻中透露谷歌在其广告中使用了这个技巧。至少,在使用这个技巧时,我已经完全无法在 Safari 中设置 cookie。我发现了一些随机的互联网帖子,声称 Apple 正在努力弥补漏洞,但我没有找到任何官方消息。

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

那么有人确切地知道 Safari 是否确实关闭了这个漏洞吗?如果是这样,是否有其他解决方法(除了在每个请求中手动包含 session ID 之外)?

最佳答案

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

正如我在 post I made 中所述:

基本上您需要做的就是将您的页面加载到 top.location,创建 session 并将其重定向回 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 制作的,但它实际上可以在任何其他类似情况下使用。


编辑 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

关于javascript - Safari 第 3 方 cookie iframe 技巧不再有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9930671/

相关文章:

javascript - 如何使用 HTML 和 javascript 从表单框中显示 URL?

javascript - 通过innerHTML添加内容(包括iframe)是不完整的

javascript - jQuery 查找所有输入类型,选择 ajax 请求

Javascript算术运算符不起作用

api - 如何通过 Facebook 的 Connect API 将视频发布到我的 Facebook 个人资料页面?

Facebook:有没有办法检查我是否拥有某些权限?

javascript - 延迟广告加载

javascript - 如何为以下 Angular 函数编写单元测试用例

javascript - 我将如何构造一个对象数组以便我可以以这种方式引用属性?

iphone - Facebook 和 Twitter 与 iPhone 应用程序的集成无法在设备上运行