想知道是否有人能提供一些说明,说明为什么在php会话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接收post,我使用php使用发送的$_POST变量来验证登录凭据并登录用户。但是,如果这些值是有效的,则用户不会登录到example.com中。如果,我将example.com的会话cookie上的samesite参数更改为“lax”,所发布的表单将按预期工作。
在添加它之前,我确实读过了samesite参数,我没有看到任何突出在我身上的东西会影响post/get。我在这里错过了什么?我看不出samesite参数对我在这里做什么有什么影响。我从另一个域发送了一篇文章,检索了变量,并使用php执行了一些逻辑.会话cookie的samesite参数与这里的任何内容有什么关系?
更新:
我做了一些调试。post变量可以很好地发送和接收,会话是在example.com上创建的,并创建了大量的$_SESSION变量等等。我将问题缩小到了在php中验证用户名/密码之后发生的重定向问题。如果用户/pass是正确的,并且帐户存在,则我将用户信息存储在$_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");,以查看这是否有影响,但问题仍然存在。
所以我现在的问题是..。在我的会话中使用samesite='strict'时..。为什么会话在重定向到同一域中的页面后被清空?
更新2:
我将会话保存路径更改为另一个位置,专门用于调试并查看发生了什么。当它到达example.com时,它将创建会话文件,并且我添加到其中的值也在其中。当它到达example.com/main.php (重定向)时,它会创建一个全新的会话文件,如上面所示。我的会话设置和开始都在它们自己的文件中,这是这些页面需要的第一件事:
session_name('Example_Login');
session_set_cookie_params(['lifetime' => 0, 'path' => '/', 'domain' => '.example.com', 'secure' => true, 'httponly' => true, 'samesite' => 'strict']);
session_start();因此,对于samesite=“严格”,上面创建了一个新会话,但对于samesite='lax‘,它使用的是上一页中相同的会话文件。怎么回事?我看到的是什么地方出了问题,但不是为什么会发生,也不知道如何解决。
更新3:
创建了一个非常简单的测试来演示正在发生的事情和原因。见下面的回答。人们可以和我争论一整天,证明为什么这样做是正确的,但我认为这里发生的逻辑是有缺陷的。
发布于 2020-07-10 17:49:13
SameSite=Strict意味着不会在跨站点请求(包括跨站点POST请求和从跨站点POST请求触发的重定向)上发送cookie。
SameSite=Lax是您的会话cookie的正确选项。能够在这里使用Strict不是更好,也不是更安全,对于这个用例来说,它的限制性太大了。
发布于 2020-07-09 17:19:31
我把这整件事归结为一个简单的测试。
example.com有两页:
test1.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();
?>test2.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>';
?>test.com
<a href="https://www.example.com/test1.php">go to test</a>如果从test.com开始,会话和cookie (创建于example.com/test1.php)在example.com/test2.php处为空。这一切都与用于samesite的链接和逻辑有关,在我看来,这在本例中是有缺陷的。它正在阻止的会话和cookie是在这个站点上创建的,这个站点应该是从“外部”保护的。我相信有人会有一些理由来证明这一点,但据我所见,这整件事是为了减轻错误编码的结果.在这种情况下..。阻止合法代码按应有的方式工作。这个例子说明我没有使用test.com中的任何东西.然而,由于重定向是在到达example.com/test1.php时发生的,所以当到达example.com/test2.php时,它会看到在它上创建的会话和cookie或多或少是“坏”的,因为链是从test.com开始的。
https://stackoverflow.com/questions/62805645
复制相似问题