编辑:半解决。我现在可以将不安全的密码存储在我的数据库中并登录。下一步是再次尝试为忘记密码创建安全机制(以及md5加密)。
我正在尝试从我的密码中删除md5哈希,因此我可以轻松地将用户的密码发送到他的电子邮件中,以防他忘记密码(我尝试了几种使用md5加密生成新密码的解决方案,但我失败了。所以我想这么简单 - 但有点不安全 - 方式)。
我有以下代码以密码格式将密码存储在数据库中。我也可以毫无困难地登录...但是如上所述,我想删除散列。我删除了
$new_password = password_hash($upass, PASSWORD_DEFAULT);
并将'$ new_password'更改为'$ upass'。
当我查看我的数据库时,我可以看到一个非哈希的密码,这正是我想要的。但是,我无法再使用未加密的密码进行登录。这不奇怪吗?我可能做错了什么?
这是我的注册码的片段。
include_once 'dbconnect.php';
if(isset($_POST['btn-signup']))
{
$uname = $MySQLi_CON->real_escape_string(trim($_POST['user_name']));
$email = $MySQLi_CON->real_escape_string(trim($_POST['user_email']));
$upass = $MySQLi_CON->real_escape_string(trim($_POST['password']));
$phone = $MySQLi_CON->real_escape_string(trim($_POST['phone']));
$new_password = password_hash($upass, PASSWORD_DEFAULT);
$check_email = $MySQLi_CON->query("SELECT user_email FROM users WHERE user_email='$email'");
$count=$check_email->num_rows;
if($count==0){
$query = "INSERT INTO users(user_name,user_email,user_pass,user_phone) VALUES('$uname','$email','$new_password','$phone')";
if($MySQLi_CON->query($query))
{
$msg = "<div class='alert alert-success'>
<span class='glyphicon glyphicon-info-sign'></span> successfully registered !
</div>";
}
else
{
$msg = "<div class='alert alert-danger'>
<span class='glyphicon glyphicon-info-sign'></span> error while registering !
</div>";
}
}
else{
$msg = "<div class='alert alert-danger'>
<span class='glyphicon glyphicon-info-sign'></span> sorry email already taken !
</div>";
}
$MySQLi_CON->close();
}
停止。
甚至不要考虑允许您(作为开发人员)以某种方式获取用户的纯文本密码的任何内容。
原始问题的解决方案非常简单,不涉及以明文形式存储用户密码。如果用户忘记了密码,请执行以下操作:
(当然,这假设攻击者无法收到邮件;你可以考虑采取任何其他措施使其更安全。一个受欢迎的是“秘密”,如“你的第一只宠物的名字”等;你可以给他们发短信,不管......但这是另一个故事)。
在任何时候你都没有处理纯文本密码,这是完全禁止的,非常缺乏。