在 Safari 上设置 cross-site cookie

Setting cross-site cookie on Safari

有两个网站:AB。我希望打开网站 B 的用户在 没有 访问网站 A 时被重定向到另一个网站(例如 http://example.com) .

为此,我尝试在网站 B 上设置一个 cookie(只需在网站 A 上加载一个页面,设置 cookie)。打开网站时 B 我检查那个 cookie。

这很好用,但在 Safari 上除外。 Safari 阻止在网站 B 上设置 cookie。我搜索了很多,发现 Safari 默认情况下会阻止 third-party cookie。

该问题的另一种解决方案是使用 Referer header(当单击网站 A 上的 link 时,引用将被发送到网站 B)——这对于不想被跟踪的用户来说是失败的,他们禁用了引用 header.

这个问题有没有简单的解决方案,没有我们存储 ips 或类似东西的数据库?

这是我目前拥有的代码:

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

这似乎是不可能实现的。 Safari 只接受来自用户 导航 到 him-/herself.

的页面的 cookie

早在 2010 年 (source) 就有一个相当老套的解决方法,但 2013 年及之后的评论指出它不再有效。到目前为止我尝试了这些东西:

  • 2010 年的原创黑客(原创和一些变体)。
  • 通过以 iFrame 作为目标的 post 表单元素请求页面。
  • 加载初始化会话(设置 cookie)的脚本...
    • img-标签
    • 脚本标签
    • AJAX-通过jquery
    • 调用

都没有成功。我发现即使 google 地图和分析也不会在 Safari 中设置任何 cookie。

可能可以通过 link 加载页面来规避此问题,该页面设置 cookie,然后立即重定向到具有嵌入式 iFrame 的页面。我没有测试这种方法,因为它不能满足我们对可用性和美学的需求。当带有 iFrame 的页面可以通过 deep link!

访问时,请谨慎使用它