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?