所以这是“我如何让第 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/