2

我一次又一次地看到 Charles Miller 的“持久登录 Cookie 最佳实践”在这里推荐为在站点上实现“记住我”功能的绝对最佳方式(如果您真的非常需要该功能,我会这样做)。

但是,我在网上搜索过,我找不到任何实际的 PHP/MySQL 代码来实现他的解决方案,而且由于在使用“记住我”方面“安全”被强调了无数次,我害怕编码我自己从头开始,因为担心我会误解某些东西或犯下会导致巨大安全漏洞的错误。

由于他的解决方案已有近 10 年的历史,并且恰好是关于持久登录 Cookie 的 SO 上最受好评的答案,因此肯定有一些经过审查的 PHP/MySQL 代码可以正确地遵循他的解决方案,而不会出现任何意外的安全漏洞。(我发现最接近的是 Drupal 模块,但我不使用 Drupal。)

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

4

1 回答 1

1

在阅读了有关 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

于 2013-04-08T15:27:16.517 回答