我在这里一次又一次地看到Charles的"持久登录Cookie最佳实践“推荐为在站点上实现”记住我“功能的绝对最佳方式(如果您真的,真的需要这个功能,我会这么做)。
然而,我已经浏览过web,我找不到任何实际的PHP/MySQL代码来实现他的解决方案,而且由于“安全性”在使用“记住我”方面被强调了无数次,所以我害怕自己从头开始编写代码,因为我害怕我会误解一些东西或者犯了一个错误,这会导致一个巨大的安全漏洞。
由于他的解决方案已经将近10年了,而且碰巧是多数被否决的答案,所以对于持久性Login,肯定有一些经过审查的PHP/MySQL代码,它们正确地跟踪了他的解决方案,没有任何意外的安全漏洞。(我发现的最接近的东西是Drupal模块,但我不使用Drupal。)
有人知道我在哪里能找到它吗?
发布于 2013-04-08 15:27:16
在阅读了关于StackOverflow的一个问题之后,我通过为本教程编写了Charles的“持久性login最佳实践”的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。
https://stackoverflow.com/questions/15647261
复制相似问题