Có quá nhiều thứ sai với mã của bạn và sẽ cực kỳ khó khăn để đưa ra giải pháp bằng cách sửa những gì bạn có hiện tại.
Thứ nhất, MD5 không còn được coi là an toàn để sử dụng để lưu trữ mật khẩu.
Tham khảo ý kiến:
- https://security.stackexchange.com/questions/ 19906 / is-md5-được coi là không an toàn
- https://en.wikipedia.org/wiki/MD5
Thêm vào đó, bạn đang sử dụng các câu lệnh chuẩn bị không chính xác.
Như tôi đã nêu, mysqli_escape_string()
hàm yêu cầu một kết nối cơ sở dữ liệu được truyền dưới dạng tham số đầu tiên:
Tự làm giúp mình và sử dụng câu trả lời này, một trong những câu trả lời của ircmaxell https://stackoverflow.com/a/29778421/
Rút ra từ câu trả lời của anh ấy:
Chỉ cần sử dụng một thư viện. Nghiêm túc. Chúng tồn tại là có lý do.
- PHP 5.5+:sử dụng
password_hash()
- PHP 5.3.7+:sử dụng
password-compat
(một gói tương thích cho ở trên) - Tất cả những người khác:sử dụng phpass
Đừng tự làm điều đó. Nếu bạn đang tạo muối của riêng mình, BẠN ĐANG LÀM SAI . Bạn nên sử dụng một thư viện xử lý điều đó cho bạn.
$dbh = new PDO(...);
$username = $_POST["username"];
$email = $_POST["email"];
$password = $_POST["password"];
$hash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $dbh->prepare("insert into users set username=?, email=?, password=?");
$stmt->execute([$username, $email, $hash]);
Và khi đăng nhập:
$sql = "SELECT * FROM users WHERE username = ?";
$stmt = $dbh->prepare($sql);
$result = $stmt->execute([$_POST['username']]);
$users = $result->fetchAll();
if (isset($users[0]) {
if (password_verify($_POST['password'], $users[0]->password) {
// valid login
} else {
// invalid password
}
} else {
// invalid username
}