这个问题更多的是关于一个概念,而不是代码问题本身。我参与了一些需要自定义网络邮件的项目,由于我是一名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
一样。每次他们登录时,你都会以同样的方式再次生成哈希,如果哈希匹配,就让他们登录。