[英]Is this safe enough for user login and verification? (PHP, MySQL, Sessions)
只是想确保我没有错过任何明显的东西。 需要你的家伙专业知识。
数据库中的用户数据: - 密码存储为crypt(),其中存储在用户表中的salt字符串。
会话: - 当用户正确登录时,我在会话表中创建一个具有唯一sha256哈希会话ID的新行。 我也在那里存储user_id,以查看哪个会话存在于哪个用户。 - 我创建了一个cookie,我将会话ID存储在其中。 - 当用户通过访问注销功能注销时会删除会话。 - 会话在定义的到期时间内自动删除(例如7天)
身份验证: - 检查客户端是否有包含会话ID的cookie。 如果cookie会话ID与会话表中的会话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
);
}
使用CRYPT_SHA512加密并且盐是安全的,但建议使用password_hash()。
不应使用带有MD5或类似弱哈希的密码。
会话处理过于复杂。
PHP具有会话处理功能,您可以在其中存储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)
}
可以在DB中存储会话ID,但是向DB添加另一个不需要的额外请求。 它不会增加安全性。 实际上,您会发现用户使用数据库方法同时从两个不同的浏览器(移动和桌面,移动API)登录的问题,因为会话ID将不同。
更重要的是: - 每个用户都应该有不同的盐 - 强制执行最小密码长度(8个字符串) - 强制使用大量字符(小写,大写,数字,特殊字符) - 允许安全重置新密码(不需要密码通过电子邮件发送) - ....
“足够安全”有点难以回答,但还有一些其他需要考虑的事项:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.