我想确认是否有什么显而易见的漏洞。需要您们专业知识的帮助。
数据库中的用户数据: - 密码存储为通过crypt()加盐处理的字符串,盐值存储在用户表中。
会话: - 当用户成功登录后,我会在sessions表中创建一个具有唯一sha256哈希会话ID的新行。我还在其中存储了user_id以便查看哪个会话与哪个用户相关。 - 我创建了一个cookie,并将会话ID存储在其中。 - 通过访问登出功能,可以删除会话。 - 会话在定义的过期时间(例如7天)后自动删除。
认证: - 检查客户端是否有一个包含会话ID的cookie。如果cookie中的会话ID与sessions表中的某个会话ID相匹配,则用户已经通过身份验证。
你们觉得如何?还需要做些什么吗?
编辑:添加了生成密码的方法:
数据库中的用户数据: - 密码存储为通过crypt()加盐处理的字符串,盐值存储在用户表中。
会话: - 当用户成功登录后,我会在sessions表中创建一个具有唯一sha256哈希会话ID的新行。我还在其中存储了user_id以便查看哪个会话与哪个用户相关。 - 我创建了一个cookie,并将会话ID存储在其中。 - 通过访问登出功能,可以删除会话。 - 会话在定义的过期时间(例如7天)后自动删除。
认证: - 检查客户端是否有一个包含会话ID的cookie。如果cookie中的会话ID与sessions表中的某个会话ID相匹配,则用户已经通过身份验证。
你们觉得如何?还需要做些什么吗?
编辑:添加了生成密码的方法:
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
);
}