这对于用户登录和验证是否足够安全?(PHP、MySQL、会话)
只是想确保我没有错过任何明显的东西。需要你们的专业知识 数据库中的用户数据: -密码以crypt()形式存储,该crypt()使用存储在用户表中的salt字符串进行加密 会议: -当用户正确登录时,我在会话表中创建一个具有唯一sha256哈希会话ID的新行。我也在其中存储用户ID,以查看哪个用户存在哪个会话。 -我创建了一个cookie,将会话ID存储在其中。 -当用户通过访问注销功能注销时,会话将被删除。 -会话在定义的过期时间(例如7天)自动删除 身份验证: -检查客户端是否有会话ID为的cookie。如果cookie会话ID与sessions表中的会话ID匹配,则对用户进行身份验证 你们觉得怎么样?我还需要做点别的吗 编辑:添加了生成密码的方法:这对于用户登录和验证是否足够安全?(PHP、MySQL、会话),php,mysql,sql,session,cookies,Php,Mysql,Sql,Session,Cookies,只是想确保我没有错过任何明显的东西。需要你们的专业知识 数据库中的用户数据: -密码以crypt()形式存储,该crypt()使用存储在用户表中的salt字符串进行加密 会议: -当用户正确登录时,我在会话表中创建一个具有唯一sha256哈希会话ID的新行。我也在其中存储用户ID,以查看哪个用户存在哪个会话。 -我创建了一个cookie,将会话ID存储在其中。 -当用户通过访问注销功能注销时,会话将被删除。 -会话在定义的过期时间(例如7天)自动删除 身份验证: -检查客户端是否有会话ID为的c
public function generate_salt($password) {
$cost = $this->CONFIG['user__password_encrypt_cost'];
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
// Prefix information about the hash so PHP knows how to verify it later.
// "$2a$" Means we're using the Blowfish algorithm. The following two digits are the cost parameter.
$salt = sprintf("$2a$%02d$", $cost) . $salt;
// Hash the password with the salt
$hash = crypt($password, $salt);
return array(
'salted_password' => $hash,
'salt' => $salt
);
}
带有Crypt_SHA512和salt的Crypt是安全的,但是建议使用password_hash() 不应使用带有MD5或类似弱哈希的Crypt 会话处理过于复杂 PHP具有会话处理功能,您可以在其中存储cookie(它实际上自动存储cookie)。 在会话中,可以添加用户id
$_SESSION['userid'] = $sUserIdFromDB;
如果客户端有cookie,它将找到会话数据,您可以检查他是否登录
if (isset($_SESSION['userid'])
AND is_int($_SESSION['userid']) AND (0 < $_SESSION['userid'])) {
$oUserRow = $oDB->getByID($_SESSION['userid']);
} else {
// user is not logged in (has no valid session)
}
if(isset($\u会话['userid']))
和是_int($_会话['userid'])和(0<$_会话['userid'])){
$USERROW=$oDB->getByID($\u会话['userid']);
}否则{
//用户未登录(没有有效会话)
}
将会话ID存储在DB中是可能的,但会向DB添加另一个不必要的额外请求。它不会增加安全性。实际上,您会发现用户同时从两个不同的浏览器(移动和桌面,移动API)使用DB方法登录的问题,因为会话ID不同
更重要的是:
-每个用户都应该有不同的盐
-强制执行密码的最小长度(8个字符)
-强制使用多种字符(小写、大写、数字、特殊字符)
-允许安全重置新密码(不应通过电子邮件发送密码)
-…回答“足够安全”有点困难,但这里有一些其他问题需要考虑:
谢谢在表中设置会话的原因是,我希望能够看到哪些用户在线,以及他们上次执行的操作。因此,对于每一次页面加载,我都会使用该信息更新会话表中的信息。我还将有一个列定义用户登录的客户机,这样我就可以区分这些信息,并向用户显示他从哪个前端激活等…1。请看我原来的问题帖子,我用生成密码的代码更新了它。2.我会要求整个网站的SSL实际上,至少这是我现在的计划。3.谢谢,我会留意的!我不知道,现在它只是:setcookie('cookie\u name',$session\u id,$expire);4.你是说对数据库的物理访问受到限制吗?那么是的。5.有关密码生成,请参见上面的“我的代码”。6.是的。7.数据库连接由PHP连接到webroot之外的后端。没有前端可见性。再次感谢!谢谢我已将此标记为已解决:)