0

长话短说,我正在开发一个内部报告引擎。它完全基于网络(使用 PHP 和各种 AJAX 技术),并通过我们的生产软件解释存储在 MySQL 数据库中的数据。它在 Ubuntu 8.04 服务器上运行,所有员工在该机器上都有一个 linux 用户帐户。我使用 pam_auth 设置了一个登录系统,它强制用户使用他们的 linux 用户帐户登录,并确定他们是否属于访问特定报告的适当组。

这部分效果很好,我的问题是使用 cookie 添加“记住我”功能。我希望用户有一个 30 天的 cookie,只是为了节省他们一些时间,并且每次会话到期时都必须登录。我编写了代码的“记住我”部分,它很好地存储了 cookie。我只存储他们的用户名和密码的 md5 哈希值。当需要重新验证它们时,问题就来了。通常我只需将存储的用户名与数据库中该用户的密码哈希进行比较即可。使事情复杂化的是我无法直接访问用户名和密码哈希。它们都存储在 /etc/passwd 和 /etc/shadow 中,登录由 PAM 模块处理。pam_auth 需要纯文本用户名和纯文本密码。

似乎我唯一的选择是将密码存储为纯文本,或者使用可逆加密,但我并不特别喜欢这些想法中的任何一个。

这里有更好的解决方案吗?

4

1 回答 1

0

您可以使用的另一个选项是 PHP 的内置会话管理。那么唯一需要在用户计算机上设置的 cookie 就是 PHP 会自动为你做的会话 ID。

您可以通过更改以下两个 ini 设置将 PHP 会话长度设置为至少 30 天:“session.cookie_lifetime”和“session.gc_maxlifetime”。然后,一旦用户登录,您就可以存储他们的用户名,以及他们在调用 session_start() 后登录到 $_SESSION 超级全局数组时。当用户返回时,您可以检查 $_SESSION 数组中的值,以查看他们是否已登录以及是否少于 30 天前。

现在,如果您出于其他原因此时仍需要 PAM 身份验证,则必须将其密码以明文或可逆加密的形式存储在会话变量中。虽然这并不理想,但它比作为用户浏览器中的 cookie 更安全。有关更多信息,请查看PHP 会话手册

于 2010-01-08T22:31:43.653 回答