如何使用 PHP 创建一个安全的“记住我”系统?

Posted

技术标签:

【中文标题】如何使用 PHP 创建一个安全的“记住我”系统?【英文标题】:How can I create a secured "remember me" system using PHP? 【发布时间】:2011-04-08 09:39:10 【问题描述】:

我有一个登录系统。如何使用 cookie 实现安全的记住我系统。

我应该在 cookie 用户名和密码中存储什么值,但如何保护它?

【问题讨论】:

我已尝试将用户名和密码存储在 cookie 中 好的。那是一个开始。但如果我拦截了那个 cookie,那么你就暴露了。看下面:***.com/search?q=php+session+hijacking 坏主意。不仅该机器上的任何人都可以读取用户+密码组合,而且任何发送document.cookie 的 XSS 都可以逐字查看您的用户名/密码。 即您希望通过减少可能的损害来至少使针对您的自动登录系统没有吸引力。在我看来,一个可行的解决方案 a) 必须 包含一个临时文件。用于代替实际用户/密码的密钥 b) 应该提及 cookie 的 http_only 属性,可能还有域/路径属性。 c) 应该提及不要相信这种类型的“登录”以及何时何地需要输入密码。 您应该尽可能重用现有的身份验证框架,因为它确实很复杂。比如看看github.com/delight-im/PHP-Auth 【参考方案1】:

然后在 db 中定义一个 Salt foreach 用户

关于设置

$expire_time = time() + 2 * 7 * 24 * 3600; // 2 weeks exp time

setcookie( 
    "rememberMe",
    crypt($username, $salt),
    $expire_time,
    '/'
);

关于验证

$_COOKIE['rememberMe'] === crypt($username, $salt)

【讨论】:

【参考方案2】:

也许您可以创建一个 16 字符的字母/数字字符串,该字符串在数据库中与该用户和 mac 地址相关联,以便(只要人们不太努力和欺骗 mac)只有该机器可以登录.

【讨论】:

【参考方案3】:

也许您应该(在您的数据库中)存储访问者 IP、用户代理、时区或已安装的插件。使用 javascript 可能很容易获得一些东西,因为获取 MAC 地址可能是个问题。

然后您可以轻松检查用户是否具有与上次相同的 IP、UA、时区或插件 :) 或者您可以使用 MaxMind 检查他的位置并确认他是否使用了正确的时区。如果有任何可疑之处,您应该丢弃 cookie 凭据。

【讨论】:

【参考方案4】:

没什么大不了的...不要让您的会话文件被清理(ini设置session.gc_probability = 0),并将会话cookie从临时更改为永久(ini设置session.cookie_lifetime = however_long_you_want_the_user_to_be_remembered)。

当然,您可能希望最终清理陈旧的会话文件,因此您可以尝试非常低概率进行清理,或者进行一些外部清理。无论哪种方式,只要用户保留会话 cookie 而您保留会话文件,它们就会被“记住”。

【讨论】:

我认为使用setcookie() 设置cookie 比让会话永不过期更好。 好吧,不管怎样,如果用户记住了,会话将被重新创建,所以不妨保留它。如果下次访问确实到来时访问之间的时间间隔很长,您总是可以删除关键数据。

以上是关于如何使用 PHP 创建一个安全的“记住我”系统?的主要内容,如果未能解决你的问题,请参考以下文章

我的“记住我”php 登录系统有多安全? [关闭]

PHP登录系统:记住我(持久cookie)[重复]

在 PHP 中使用“记住我”功能的正确方法

如何实施安全的“记住我”

“记住我” - 在 cookie 中保留啥? -PHP [重复]

WebSockets + PHP(棘轮)登录系统