确实有必要将用户名/密码保存到SESSION变量中


Is really necessary to keep username/password into a SESSION variable?

这个问题更多的是关于一个概念,而不是代码问题本身。我参与了一些需要自定义网络邮件的项目,由于我是一名Windows用户,我决定使用hMailServer+PHP进行后端处理。但是,第一个疑问是:hMailServer为我提供了对COM API的支持,这种方法可以通过PHP访问,这很好。所以对于登录,我可以做一些类似的事情:

<?php
    $obBaseApp = new COM("hMailServer.Application");
    $obBaseApp->Authenticate("email@privmail.local", "12345") or die('Invalid user');
?>

要将电子邮件放入当前登录用户的收件箱,我需要执行以下操作:

$obBaseApp = new COM("hMailServer.Application");
$obBaseApp->Authenticate("email@privmail.local", "12345") or die('Invalid user');
$obDomain = $obBaseApp->Domains->ItemByName("privmail.local");
$obAccount = $obDomain->Accounts->ItemByAddress("email@privmail.local");
$obMessage = $obAccount->Messages;
$totalMessages = $obMessage->Count;
for ($i = 0; $i < $totalMessages; $i++)
{
    echo $obMessage->Item[$i]->Subject;
}

好吧,让我们想象一下以下场景:在登录页面中,我使用上面发布的第一个代码来检查登录是否有效。。。如果它有效,我重定向到收件箱页面,在那里我解析所有电子邮件。。。但要做到这一点,我需要将用户名/密码保存在会话变量中,最糟糕的是:解密!这是正确的方法吗?

验证用户为其生成随机sha512哈希后,将其保存到他的DB记录中,将其附加到会话,并仅将session ID存储在他们的cookie中。

通过这种方式,用户的浏览器将请求会话状态,您的脚本将查找会话匹配哈希,然后决定是否允许访问。

建议采取其他预防措施:存储用户代理、IP地址、设置会话过期时间、检测空闲时间等。

编辑:考虑developerjk所说的内容。如果你真的需要对hMailServer的纯密码进行操作,那就太糟糕了。明文密码永远不应该存储在任何地方,而不是数据库或会话中。在用户注册后,您应该生成一个由他们的salt + password组成的hash,将其保存为密码,并仅将其传递给hMailServer,以进行身份验证,就像我在上面提到的session ID <-> hash <-> access一样。每次他们登录时,你都会以同样的方式再次生成哈希,如果哈希匹配,就让他们登录。