PHP 登录逻辑“恢复之前的登录”

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

我想用PHP实现一个登录机制,能够:

  • 首次登录时询问用户名和密码;
  • 如果您在上次登录后 x 天内重新访问该网站,请不要再次询问用户名和密码。

问题:我怎样才能实现这一点?

大致上,我打算按照以下流程图来实现这次登录:

enter image description here 调用 php 函数

requestContentPage()
。然后,服务器检查用户是否最多在 x 天前登录(框(1))。如果用户最多 x 天前没有访问过该网站(即一段时间内第一次登录,或有史以来第一次登录),则通过
renderLoginPage()
函数调用登录页面。另一方面,如果最后一次登录是“最近”完成的,那么(3)我们检索用户的信息,然后(4)我们呈现所请求的内容页面。

enter image description here

当用户在登录页面点击“登录”按钮时,会调用函数

submitLoginPage($u, $p$)
。然后(5),系统检查密码为
$u
的用户
$p
是否是数据库中的“用户表”。如果是这样 (6),则将登录持续时间设置为 x 天,并呈现内容页面 (4)。否则,将再次呈现登录页面以询问正确的凭据。

我很确定我可以使用“会话”在 PHP 中实现这一点(即

session_start()
session_status()
等)。我已经问过类似的问题了

多次调用session_start()

但我无法更进一步。在那里,您可以找到我的 PHP 代码尝试。我被困住了。 (也许有些函数的命名与本文中的不同)。

php authentication session
1个回答
0
投票

“如果您在上次登录后 x 天内重新访问该网站,则无需再次询问用户名和密码。”

您的问题 - 或者至少是a问题 - 是使用cookie进行访问,并且该cookie不仅设置为在相对的时间限制内过期(取决于服务器和您)可能无权访问此配置),但大多数服务器都有例程,会在一段时间后销毁服务器端 cookie 数据,独立于 Web 服务器

该机制的工作原理如下:

  • PHP 代码发出 session_start()
  • cookie 是从客户端生成或获取的
  • 在服务器上默默地创建一个名称取决于该 cookie 的文件,或者检查其是否存在;例如你的 cookie 是 0xbaadf00d,文件将是
    /var/lib/php/tmp/session-baadf00d
  • 如果您发送了 cookie 但文件不存在,则会创建一个空会话
共享服务器可能每 72 小时进行一次维护,并允许用户设置他们想要的任何 cookie 持久性...只要少于 72 小时。不仅如此,会话还会出现故障(一些提供商甚至可能没有意识到这个问题,以前从未遇到过)。

因此,在您的场景中,大约一两天后,文件被删除,客户端会带着旧的 cookie 返回,您瞧,服务器已经忘记了它们。在这种情况下,PHP 会自动启动一个全新的空会话。

一个可能的解决方法是将会话 ID(来自 cookie)保存在数据库中,并在其中存储最少量的信息以及会话创建

或更新时间。

然后:

    使用session_start()
  • 恢复 $_COOKIE[SESSION_ID]。如果用户是已知的,他们将重用现有的 cookie。 PHP 可能会破坏会话,因为它不再存在,但
  • received cookie 将保持不变。不过,它可能会在下次调用时被重写。
  • 检查发送的cookie是否存在于数据库中并且仍然新鲜
  • 尽可能验证它是否与用户匹配 - 例如相同的用户代理;我认为如果没有正确的登录,您无法恢复更多
  • 利润(例如,伪造 ID 所属用户的成功登录,并在会话中注入所有内容;还可以使用新的 session_id 更新数据库,如果它发生更改;您可以使用
  • session_id()
     恢复它)。
或者,您可以发送保存在 LocalStorage 中的浏览器特定令牌,并以这种方式注入登录数据。这看起来更有希望,因为你可以完全绕过整个 cookie 的事情。其实你可以从 LocalStorage 发送

整个信息包:

    “beforeLogin”页面包含一个 Javascript,用于访问 LocalStorage 并获取登录对象,或将其创建为空
  • 对象被发送到服务器
  • 利润
在后一种情况下,您可能希望保存来自服务器的安全批准 - 即服务器使用类似 {$timestamp}:{$validation} 的令牌回复

true 登录,其中validation = MD5("{$ Secret},{$timestamp}") - 当令牌可能被刷新时,客户端必须在后续登录时发回此信息。这样,客户端就无法自己“刷新”令牌,因为他们不知道必要的 $secret,并且您可以避免人们在三年后使用陈旧的伪造包登录。

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