【问题标题】:Setting cross-site cookie on Safari在 Safari 上设置跨站 cookie
【发布时间】:2016-05-12 11:17:03
【问题描述】:

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

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

这很好用,但在 Safari 上除外。 Safari 阻止在网站 B 上设置 cookie。查了很多,发现Safari默认会屏蔽第三方cookies。

该问题的另一个解决方案可能是使用Referer 标头(当单击网站A 上的链接时,引用者将被发送到网站B)——这对于不想获取的用户来说会失败跟踪,他们禁用了引用标头。

是否有一个简单的解决方案来解决这个问题,而无需我们存储 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">

【问题讨论】:

标签: javascript php cookies safari cross-domain


【解决方案1】:

这似乎是不可能实现的。 Safari 仅接受来自用户导航到他/她自己的页面的 cookie。

早在 2010 年 (source) 就有一个相当老套的解决方法,但 2013 年及以后的 cmets 声明它不再有效。到目前为止,我尝试了这些事情:

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

一切都没有成功。我发现即使是谷歌地图和分析也没有在 Safari 中设置任何 cookie。

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

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 2021-05-02
    • 2012-12-20
    • 2021-02-05
    • 2023-04-04
    • 1970-01-01
    • 2021-05-08
    • 2021-06-10
    • 2020-02-21
    相关资源
    最近更新 更多