我在哪里可以找到一个PHP/MySQL实现查尔斯·米勒的“持久登录cookie”;解决方案


Where can I find a PHP/MySQL implementation of Charles Miller's "Persistent Login Cookie" solution?

我多次看到Charles Miller在这里推荐的"持久登录Cookie最佳实践"作为在网站上实现"记住我"功能的绝对最佳方式(如果你真的,真的需要这个功能,我就是这样)。

然而,我已经搜索了网页,我找不到任何实际的PHP/MySQL代码实现他的解决方案,因为"安全"被强调了无数次关于使用"记住我",我害怕自己从头开始编写,因为我害怕会误解一些东西或犯一个错误,这将导致一个巨大的安全漏洞。

因为他的解决方案几乎是10年前的,碰巧是SO上关于持久登录cookie的最多投票的答案,肯定有一些经过审查的PHP/MySQL代码正确地遵循他的解决方案,没有任何意外的安全漏洞。(我找到的最接近的东西是Drupal模块,但我不使用Drupal。)

有谁知道我在哪里可以找到它?

在阅读了关于StackOverflow的一个问题后,我受到启发,通过编写Charles Miller的"持久登录Cookie最佳实践"的PHP/MySQL实现来帮助他。对于本教程,我将假设您已经有了一个带有用户登录的PHP系统。

CREATE TABLE user_sessions (
  user_id INT(11) UNSIGNED NOT NULL,
  session VARCHAR(39) NOT NULL,
  created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
  PRIMARY KEY (user_id, session)
);

首先,我们需要在您登录时更新站点以将会话存储到cookie中。此代码将与您当前的登录系统一起使用。

if (/* Code that verifies credentials */) {
  // ... code to log user into session
  PersistentAuth::login($userId);
}

其次,我们要检查站点的新用户是否具有cookie凭据。这段代码将出现在代码的开头。它首先检查我们是否已经登录到$_SESSION中?如果没有,请尝试基于cookie的登录。

if (/* !loggedIn() */ && ($userId = PersistentAuth::cookieLogin())) {
  // ... use $userId to log user into session 
}

第三,根据Charles Miller的文章,如果用户通过cookie登录,我们不能允许用户进入以下部分:

  • 修改用户密码
  • 更改用户的电子邮件地址(特别是如果使用基于电子邮件的密码恢复)
  • 对用户地址、付款细节或财务信息的任何访问
  • 任何进行购买的能力
代码:

if (PersistentAuth::isCookieLogin()) {
  // User is logged in via cookie and don't have access to this 
  // section. We need to ask them for the password. Maybe send 
  // them to some login page?
  // TODO ask for password or send to a password page
}

要获得PersistentAuth类的所有代码,请查看我的网站:http://www.chrislondon.co/php-persistent-login/

对于这个PersistentAuth类,您必须进行一些更改。首先,必须更改getDb()函数以返回数据库的实例。我在这个例子中使用PDO。我有它设置为每个页面刷新清除旧会话的数据库。处理这个问题的最好方法是使用cron。如果您设置了一个cron,那么在类设置

中将USE_CRON标志更改为true