我已经看到了一次又一次查尔斯·米勒的“ 永久登录cookie最佳实践 ”在这里推荐为实现在网站上“记住我”的功能(如果你真的需要这个功能,这是我做的)的绝对最佳途径。
不过,我已经冲刷网页,我找不到任何实际的PHP / MySQL的代码实现自己的解决方案,而且由于“安全”是关于使用“记住我”,强调约一个极大次,我怕码我自己从头开始,因为担心我会误解的东西或犯了一个错误,这将导致一个巨大的安全漏洞。
由于他的解决办法是近10岁,恰好是最upvoted答案的SO关于持久性登录饼干,当然必须有一些审核PHP / MySQL代码在那里,正确跟随他没有任何意外的安全漏洞的解决方案。 (我发现的最接近的事情是一个Drupal模块,但我不使用Drupal。)
有谁知道在哪里可以找到它?
在计算器上阅读的问题后,我受到启发,帮助他写一个PHP / MySQL的执行查尔斯·米勒的“永久登录cookie最佳做法”在本教程中我将假定你已经有用户登录一个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);
}
其次,我们要检查是否有新的用户到该网站有饼干凭据。 此代码会在你的代码的开头。 它检查,首先,我们已经登录我们的$ _SESSION? 如果没有,请尝试基于cookie的登录。
if (/* !loggedIn() */ && ($userId = PersistentAuth::cookieLogin())) {
// ... use $userId to log user into session
}
第三,根据查尔斯·米勒的文章中,我们不能让用户在下面的部分,如果他们是通过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的类设置
文章来源: Where can I find a PHP/MySQL implementation of Charles Miller's “Persistent Login Cookie” solution?