PHP注册表单密码未明文存储至MySQL数据库问题求助
问题原因与解决方案
嘿,我一眼就瞅出问题在哪啦!你看这段PHP代码:
$password =md5($password);
这行代码就是把你输入的明文密码转换成了MD5哈希值,所以数据库里存的不是"12345",而是这个密码对应的MD5哈希结果96991368fec63c8a1bfc48a70010f84a——完全是你自己的代码主动做了这个转换哦~
两种处理方式供你选择:
1. 非要存储明文密码(极度不推荐!)
如果你确实需要明文存储(强烈建议不要这么做,风险极高),只需要删除上面那行md5()转换的代码就行,这样密码就会以明文形式存入数据库。
2. 更安全的密码存储方式(推荐!)
其实你现在用MD5哈希已经比明文好,但MD5的安全性已经过时了,容易被破解。PHP内置了更安全的密码哈希函数password_hash(),搭配password_verify()做登录验证,是当前的标准做法:
- 修改你的注册代码:
// 替换原来的md5行 $password = password_hash($password, PASSWORD_DEFAULT); - 调整数据库字段:把
password字段从Char(40)改成VARCHAR(255),因为password_hash()生成的哈希值长度可能会随着算法更新变化,255长度足够兼容未来的变化。 - 登录验证时的代码示例:
session_start(); $db=mysqli_connect("localhost","root","","register"); if(isset($_POST['login'])){ $username=mysqli_real_escape_string($db,$_POST['username']); $input_password=mysqli_real_escape_string($db,$_POST['password']); $sql = "SELECT * FROM users WHERE username='$username'"; $result = mysqli_query($db, $sql); $user = mysqli_fetch_assoc($result); // 用password_verify验证输入密码和数据库哈希值是否匹配 if($user && password_verify($input_password, $user['password'])){ $_SESSION['message'] = "You are now logged in"; $_SESSION['username'] = $username; header("location: Login.php"); } else { echo "Invalid username or password"; } }
重要提醒:
永远不要存储用户的明文密码!这是Web开发的基本安全规范,一旦数据库被攻击,明文密码泄露会导致用户的账号、甚至其他平台的账号面临被盗风险。
内容的提问来源于stack exchange,提问作者Dino Zobec
相关产品推荐
相关产品推荐

