Gmail 中的密码重置链接已损坏、会话被删除、php 错误

问题描述 投票:0回答:2

我完成了一个网站,当我发送注册和密码重置电子邮件时,登录链接已损坏。即使使用我的 Gmail 帐户,它们也能在 Thunderbird 上正常工作,但无法在 Gmail Web 界面上工作。我不知道出了什么问题。 Gmail 客户端是否会在链接的搜索部分附加任何内容或破坏唯一标识符?

另一个问题是,经过多次尝试和错误后,gmail 屏蔽了我使用的电子邮件地址。当地址是 Gmail 地址时,电子邮件将不再到达,甚至不会成为垃圾邮件。有什么办法可以解封吗?我使用的信件非常简单,只有几句话关于注册或密码重置以及一个独特的登录超链接。

php session gmail
2个回答
0
投票

我不得不等待几天,现在电子邮件再次到达我的 gmail 帐户。

链接不起作用的另一个问题是因为 google url 服务切断了 url 搜索部分的唯一标识符。我不知道如何避免这个自动取款机,但我正在努力。

发生的情况如下:

第一个网址是我所期望的,第二个网址是我从谷歌重定向中获得的。我不知道为什么会这样,也不知道如何避免。第一个是 base64 编码的 JSON。

The normal URL:
https://example.com?uid=D4Geu4PNxvZtprWRJsx3JU1iqF4LBLw2bhNdqF6uVDS63RmCQbAugCwCDoMmYuGabpWVRUZjJcXxSjNIyjr%252BjsPK%252FmQE9wog%252F04MRwrdVg7WtCwe0IPiPRVCMhUi8O%252FoYjn%252BkiMo6g%253D%253D_6qQSOARh5wslVp29_jQ1rwZEprd8b2dEO%252FkNLZQ%253D%253D

Google URL redirect:
https://example.com?uid=D4Geu4PNxvZtprWRJsx3JU1iqF4LBLw2bhNdqF6uVDS63RmCQbAugCwCDoMmYuGabpWVRUZjJcXxSjNIyjr%2BjsPK%2FmQE9wog%2F04MRwrdVg7WtCwe0IPiPRVCMhUi8O%2FoYjn%2BkiMo6g%3D%3D_6qQSOARh5wslVp29_jQ1rwZEprd8b2dEO%2FkNLZQ%3D%3D

urldecode(normalURL):
https://example.com?uid=D4Geu4PNxvZtprWRJsx3JU1iqF4LBLw2bhNdqF6uVDS63RmCQbAugCwCDoMmYuGabpWVRUZjJcXxSjNIyjr%2BjsPK%2FmQE9wog%2F04MRwrdVg7WtCwe0IPiPRVCMhUi8O%2FoYjn%2BkiMo6g%3D%3D_6qQSOARh5wslVp29_jQ1rwZEprd8b2dEO%2FkNLZQ%3D%3D

看起来 Google 对我的 URL 使用了 URL 解码,这就是它不起作用的原因。还不确定如何解决这个问题,可能使用与 Base 64 不同的编码,因此解码后的 URI 和正常的 URI 是相同的。

事实证明 SLIM 将自己的 url 编码添加到查询部分,所以我从代码中删除了它,因为它导致了双重 urlencoded 查询。没解决。

我把base64改成了hex,没有解决。

我最终成功地复制了它,而没有发送任何电子邮件,所以它也与电子邮件无关。我能够用一个简单的本地 HTML 文件重现它。这很奇怪,因为这意味着这是依赖于引用者的东西,但我的代码中没有任何依赖于引用者的行。

我在代码中检查了很多断点,对于链接单击和复制粘贴 URI,代码执行了完全相同的操作。所以我最终得出的结论是问题不在于我的代码。

我检查了 HTTP 标头,对于链接单击情况,会话 cookie 的会话 ID 发生了更改。对于这些情况,会话变量被删除,因此它不是简单的 session_regenerate_id(),而是其他东西。

我进一步调查并在我的代码中发现了这一点:

    ini_set('session.cookie_samesite', 'Strict');

当我删除这条线后,它开始正常工作。我不明白每次有人单击跨源链接时删除会话数据如何从安全角度提供任何信息。即使使用新的会话 ID,它也无法按预期工作,因为它会删除我在第一个请求中设置的会话。

"gmail"
 -clicking_on_link->
  "my_site?uid={uid}" + session_1_created
 -redirect + session_1_and_its_data_dropped->
  "my_site?main" + session2_created

empty_page
 -copy_paste_link_to_address_bar->
  "my_site?uid={uid}" + session_1_created
 -redirect->
  "my_site?main" + session_1_continued

一些普通的 PHP 来重现它:

ini_set('session.cookie_samesite', 'Strict');

session_start();
$data = isset($_SESSION['data'])?$_SESSION['data']:0;
session_write_close();

++$data;

session_start();
$_SESSION['data'] = $data;
session_write_close();

if ($_SERVER['REQUEST_URI'] === '/')
    var_dump($data);
else
    header('Location: /');
exit;

更令人担忧的是,当我不断刷新同一页面时,会话总是会被丢弃,并且我不断收到带有新会话 ID 的“1”。只有当我单击地址栏并按回车键时才能正常工作,因此我确定这是 8.0.26 的 PHP 错误,或者从安全角度来看,即使在同一来源上继续删除会话也没有任何意义。我花了 5 天的时间才找到它。终于。


0
投票

我在另一个网站上的 Gmail 和 Outlook 重定向链接中发现了类似的问题。关于

cookie_samesite
选项的线索让我能够让这些再次工作。所以谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.