繁体   English   中英

samesite session cookie 设置 - 澄清来自另一个站点的表单发布

[英]samesite session cookie setting - clarification on form post from another site

想知道是否有人可以澄清为什么在 php session cookie 中使用samesite时的行为方式。

example.com 具有以下内容:

session_name('Example_Login');
session_set_cookie_params(['lifetime' => 0, 'path' => '/', 'domain' => '.example.com', 'secure' => true, 'httponly' => true, 'samesite' => 'strict']);
session_start();

test.com 具有以下形式发布到 example.com:

<form method="post" action="https://www.example.com/" target="_blank" autocomplete="off">
    <input type="hidden" name="username" value="demo_user">
    <input type="hidden" name="password" value="demo_password">
    <input type="hidden" name="signin" value="signin">
    <button type="submit" name="submit">Login</button>
</form>

example.com 收到帖子并使用 php 我使用发送的 $_POST 变量来验证登录凭据并登录用户。由于这些值有效,用户不会登录到 example.Z4D236D9A2D102C50FE6AD1C50DA 虽然如果,我将 example.com 的 session cookie 上的 samesite 参数更改为“松弛”,则发布的表单按预期工作。

在添加它之前,我确实阅读了 samesite 参数,并且我没有看到任何对我来说会影响帖子/获取的东西。 我在这里想念什么? 我没有看到 samesite 参数对我在这里所做的事情有什么影响。 我从另一个域发送了一个帖子,检索变量,并用 php 做一些逻辑...... session cookie 的 samesite 参数与这里有什么关系?

更新:

我做了一些调试。 后变量发送和接收正常,session 是在示例上创建的。com 并创建大量 $_SESSION 变量等。我将问题缩小到在 ZE1BCFD7623E81E406B 中验证用户名/密码后发生的重定向。 如果用户/密码正确且帐户存在,我将用户信息存储在 $_SESSION 中,然后我在 php 中调用以下命令:

header("Location: /main.php");
exit();

重定向发生,到达 main.php $_SESSION 时为空。 它的所有变量都消失了。 我回应了它,它显示以下内容:

Array
(
    [user] => Array
        (
            [session] => 1
        )

)

我将 samesite 参数切换为“lax”。 运行完全相同的调试,$_SESSION 充满了我在重定向之前放置的用户信息。

我还将重定向更改为绝对作为header("Location: https://www.example.com/main.php"); 看看这是否有影响,但问题仍然存在。

所以,我现在的问题是......当在我的 session 中使用samesite='strict'时......为什么 session 在重定向到同一域上的页面后被清空?

更新 2:

我将 session 保存路径更改为另一个位置,专门用于调试,看看会发生什么。 当它到达 example.com 时,它会创建 session 文件,并且我添加到其中的值在那里。 当它到达 example.com/main.php(重定向)时,它会创建一个全新的 session 文件,如上所示。 我的 session 设置和启动在他们自己的文件中,这是这些页面上首先需要的:

session_name('Example_Login');
session_set_cookie_params(['lifetime' => 0, 'path' => '/', 'domain' => '.example.com', 'secure' => true, 'httponly' => true, 'samesite' => 'strict']);
session_start();

因此,上面使用 samesite='strict' 创建了一个新的 session,但使用 samesite='lax' 它使用上一页中相同的 session 文件。 是什么赋予了? 我看到了哪里出了问题,但不是为什么会发生或如何解决它。

更新 3:

创建了一个非常简单的测试来演示发生了什么以及为什么。 请参阅下面的答案。 人们可以整天和我争论,证明为什么这样做是有效的,但我认为这里发生的逻辑是有缺陷的。

SameSite=Strict表示不会在跨站请求中发送 cookie,包括跨站POST请求和跨站POST请求触发的重定向。

SameSite=Lax是您的 session cookie 的正确选项。 能够在这里使用Strict并不是更好或更安全,它对于这个用例来说太严格了。

我把这整个事情归结为一个简单的测试。

example.com 有两个页面:

测试1.php

<?php

//session name
session_name('Test');
session_set_cookie_params(['lifetime' => 0, 'path' => '/', 'domain' => '.example.com', 'secure' => true, 'httponly' => true, 'samesite' => 'strict']);
session_save_path($_SERVER['DOCUMENT_ROOT'].'/sessions');
session_start();

//session stuff
$_SESSION['sessiontest'] = 'worked';

//cookie stuff
setcookie('testing', 'worked', ['expires' => 0, 'path' => '/', 'domain' => 'example.com', 'secure' => true, 'httponly' => true, 'samesite' => 'strict']);

//redirect to the other page
header("Location: /test2.php");
exit();

?>

测试2.php

<?php

//session name
session_name('Test');
session_set_cookie_params(['lifetime' => 0, 'path' => '/', 'domain' => '.example.com', 'secure' => true, 'httponly' => true, 'samesite' => 'strict']);
session_save_path($_SERVER['DOCUMENT_ROOT'].'/sessions');
session_start();

echo '<pre>'.print_r($_SESSION,1).'</pre>';

echo '<pre>'.print_r($_COOKIE,1).'</pre>';

?>

测试.com

<a href="https://www.example.com/test1.php">go to test</a>

如果您从 test.com 开始,则 session 和 cookie(在 example.com/test1.php 创建)在 example.com/test2.php 处为空。 这一切都与用于samesite的链接和逻辑有关,我认为在这种情况下存在缺陷。 session 和它正在阻止的 cookie 正在网站上创建,这应该是为了防止“外部”。 我敢肯定,有人会提出一些论据来证明这一点,但据我所知,这一切都是为了减轻糟糕编码的结果......而在这种情况下......正在阻止合法代码正常工作. 此示例显示我没有“使用”来自 test.com 的任何东西......但是由于在您到达 example.com/test1.php 时发生重定向,它会看到 Z21D6F40CFB511982E4424E0E250A95 上创建的 cookie 和更多或更少到达 example.com/test2.php 因为链从 test.com 开始。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM