0

这个问题更多地是关于一个概念而不是代码问题本身。我正在参与一些需要自定义 webmail 的项目,因为我是 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;
}

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

4

1 回答 1

0

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

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

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

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

于 2015-02-20T23:33:48.200 回答