在Safari上设置跨站点cookie

4
拥有两个网站:AB。我希望打开网站B的用户,如果他们没有访问过网站A,则被重定向到另一个网站(例如http://example.com)。
为了实现这一点,我尝试在网站A上设置cookie(只需加载网站A上的一个页面并设置cookie)。当打开网站B时,我检查该cookie。
除Safari外,这种方法很有效。Safari默认阻止在网站B上设置cookie。我搜索了很多资料,发现Safari默认阻止第三方cookie。
解决此问题的另一种方法可能是使用Referer头(在单击网站A上的链接时,将引用者发送到网站B),但这对于不想被追踪且禁用引用者标头的用户无效。
是否有简单的解决此问题的方法,而无需拥有存储IP地址或类似内容的数据库?
以下是我目前拥有的代码: Website B index.php:
<?php
$cookie_name = "visited_first_website";

if(isset($_COOKIE[$cookie_name]) ) {
    echo "Visited";
} else {
    $newURL = "https://example.com";
    header('Location: '.$newURL);
}
?>

这是在网站A上运行的,使用B/set-cookie.js

window.addEventListener("DOMContentLoaded", function () {
    var iframe = document.createElement("iframe");
    //iframe.style.display = "none";

    var scripts = document.getElementsByTagName("script");
    var src = scripts[scripts.length - 1].src;
    var websiteBAddress = src.match(new RegExp("https?://[^/]*"))[0];

    iframe.setAttribute("src", websiteBAddress + "/js/embed.php");
    document.body.appendChild(iframe);
});
embed.php文件长这样:
<?php
$cookie_name = "visited_first_website";
$cookie_value = time();
setcookie($cookie_name, $cookie_value, time() + (86400 * 2), "/"); // 86400 = 1 day
header('Access-Control-Allow-Origin: *');
?>
<!DOCTYPE html>
<html>
<body>
</body>
</html>

那么,解决这个问题的最简单工作流是什么?
我也尝试加载一个图像标签,但它没有起作用:
<img src="B/js/embed.php">

1个回答

3

这似乎是不可能实现的。Safari仅接受用户自己已经导航过的页面的cookie。

早在2010年就有一个非常hacky的解决方法(来源),但是2013年以后的评论都说明它无效了。到目前为止,我尝试了以下几种方式:

  • 2010年的原始hack(包括一些变化)。
  • 通过post-form元素请求带有iFrame标记的页面。
  • 加载一个脚本,通过以下方式初始化会话(设置cookie)...
    • img标记
    • script标记
    • 使用jQuery的AJAX调用

所有的尝试都没有成功。我发现即使Google地图和分析工具也不会在Safari中设置任何cookie。

可能有一种方法可以规避问题,就是通过链接加载一个页面,该页面设置一个cookie,然后立即重定向到带有嵌入式iFrame的页面。不过我没有测试这种方法,因为它不能满足我们对可用性和美观的需求。当带有iFrame的页面可以通过深度链接访问时,请谨慎使用此方法!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接