Php 是否真的需要将用户名/密码保留在会话变量中?

Php 是否真的需要将用户名/密码保留在会话变量中?,php,webmail,hmail-server,Php,Webmail,Hmail Server,这个问题更多的是一个概念,而不是一个代码问题本身。 我进入了一个需要定制webmail的项目,因为我是一个Windows用户,所以我决定使用hMailServer+PHP作为后端。但是,首先出现了疑问:hMailServer为我提供了对COM API的支持,哪种方法可以通过PHP访问,这很好。因此,对于登录,我可以执行以下操作: <?php $obBaseApp = new COM("hMailServer.Application"); $obBaseApp->Aut

这个问题更多的是一个概念,而不是一个代码问题本身。 我进入了一个需要定制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;
}
$obBaseApp=new COM(“hMailServer.Application”);
$obBaseApp->验证(“email@privmail.local“,“12345”)或die(“无效用户”);
$obDomain=$obBaseApp->Domains->ItemByName(“privmail.local”);
$obAccount=$obDomain->Accounts->ItemByAddress(“email@privmail.local");
$obMessage=$obAccount->Messages;
$totalMessages=$obMessage->Count;
对于($i=0;$i<$totalMessages;$i++)
{
echo$obMessage->Item[$i]->Subject;
}

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

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

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

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

编辑:考虑developerwjk所说的内容。 如果您确实需要对
hMailServer
使用普通密码进行操作,那就太糟糕了。普通密码不应存储在任何地方,而不应存储在数据库或会话中。 用户注册后,您应该生成一个由其
salt+密码组成的
hash
,将其另存为密码,并仅将其传递给
hMailServer
,作为标识,如我上面所说的
会话ID hash访问

每次他们登录时,您都会以同样的方式再次生成哈希,如果哈希匹配,就让他们输入。

我可能弄错了,但我认为他正在考虑在会话中保留密码,因为需要将密码提供给可能不懂哈希密码的COM对象……还有,我认为问题在于将用户名和密码存储在
$\u会话中,而不是存储在cookie中。是的,这是我的问题。如果我在COM中提供哈希传递,它将给我错误的身份验证结果…那么
$\u会话
文件存储在服务器上,而
会话ID
在cookie中额外使用。我认为这是相关的。我更新了我的答案。我编辑了我的答案,以表明密码实际上可能是一个总是单向生成的哈希,而实际密码就是这样一个哈希。