只是想确保我没有遗漏任何明显的东西。需要你们的专业知识。
数据库中的用户数据: - 密码存储为 crypt(),用存储在用户表中的盐字符串加盐。
session : - 当用户正确登录时,我在 session 表中创建一个新行,具有唯一的 sha256 哈希 session ID。我也在那里存储 user_id 以查看哪个 session 存在于哪个用户。 - 我创建了一个存储 session ID 的 cookie。 - 当用户通过访问注销功能注销时, session 被删除。 - session 在定义的到期时间(例如 7 天)自动删除
身份验证: - 检查客户端是否有带有 session ID 的 cookie。如果 cookie session ID 与 session 表中的 session 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
);
}
最佳答案
“足够安全”这个问题有点难以回答,但这里还有一些其他的事情需要考虑:
- 盐强度——是用户名还是随机值或时间戳?更喜欢后两者。
- 通过网络发送密码时是否需要 SSL?考虑这样做。
- Cookie 是否“安全”和“HttpOnly”以缓解 CSRF?如果可以,请执行此操作(取决于客户支持)。
- 是否限制员工访问盐值和加密值?限制谁有权访问任何敏感信息。
- 哪种加密算法和多少位?试试 DES 512 或更强的。
- 您是否强制执行密码强度要求?你应该!
- 数据库连接安全吗?当数据库链接通过 WAN 时尤其重要。
关于php - 这对于用户登录和验证是否足够安全? (PHP、MySQL、 session ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24421743/