1

当用户单击我网站上的按钮时,会打开一个新窗口,供用户浏览项目的第三方网站。单击一个项目后,新窗口将重定向回我的站点,其中包含有关该项目的数据。

此时(在最终重定向回我的站点之后,而不是之前),我的站点的会话 cookie(连同其他 cookie,我的 csrf 令牌 cookie 也受到影响)被擦除/丢失/刷新或其他。如果我在“主”窗口(甚至新窗口)上重新加载页面,旧会话将消失,用户将被重定向回我的登录页面。

我网站上的响应标头 set-cookie 示例:

mysite_session=XXXXXXXXXXXXX; path=/; domain=.mysite.test; httponly; samesite=lax

我正在为 PHP 使用 Laravel 框架,尽管这不应该是一个因素,因为在我开始将我的应用程序转换为 Laravel 之前,我在使用纯 PHP 时遇到了同样的问题。

每个步骤的代码:

  1. 用户单击我网站上的按钮。
$(document).on("click", "#btn-open", function()
{
    const url = "https://mysite.test/browse";
    window.open(url, "_blank", "scrollbars=yes,resizable=yes");
});

1.5。打开一个新窗口。这将通过我的网站使用他们的 API 获取第三方网站的一次性 URL。

https://mysite.test/browse在技术上只是:

<?php
$api = new ThirdPartyApi(/* data and stuff */);
$url = $api->getBrowseUrl();
?>
<html>
<body>
<h1>Wait - Redirecting...</h1>
<script>window.location.href = "<?php $url;?>";</script>
</body>
</html>
  1. 用户被重定向到第三方站点(不同的域)。

  2. 单击一个项目后,用户将被重定向回我的站点 ( https://mysite.test/return ),并带有关于该项目的 POST 数据。

https://mysite.test/return在技术上只是:

<?php
$itemData = json_encode($_POST["item"]);
?>
<html>
<body>
<script>
const itemData = <?php $itemData;?>;
// Do stuff with item data, example commented as it's unrelated
//window.opener.thirdPartyCallbackFunc(itemData);
//window.close();
</script>
</body>
</html>

我只是无法理解第三方网站怎么可能导致我自己网站的 cookie 被修改。

第三方网站是否有可能对 cookie 做了一些奇怪的事情,或者我做错了什么?有人有什么想法吗?

4

0 回答 0