Fitur “lupa password” wajib ada di aplikasi yang punya login. Caranya yang aman adalah mengirim token unik ke email pengguna, bukan mengirim password lama. Artikel ini membahas cara membuat fitur lupa dan reset password dengan PHP dan MySQL secara aman.

Konsep: Reset Password Berbasis Token
Alurnya: pengguna memasukkan email → sistem membuat token acak & menyimpannya dengan masa berlaku → token dikirim sebagai tautan ke email → pengguna membuka tautan & membuat password baru.
Langkah 1: Tabel Token
CREATE TABLE password_reset (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(100),
token VARCHAR(64),
expired_at DATETIME
);
Langkah 2: Form Lupa Password & Buat Token
<?php
require "koneksi.php";
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$email = trim($_POST["email"]);
// pastikan email terdaftar
$cek = $koneksi->prepare("SELECT id FROM users WHERE email = ?");
$cek->bind_param("s", $email);
$cek->execute();
if ($cek->get_result()->num_rows === 1) {
$token = bin2hex(random_bytes(32)); // token acak aman
$expired = date("Y-m-d H:i:s", strtotime("+1 hour"));
$stmt = $koneksi->prepare("INSERT INTO password_reset (email, token, expired_at) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $email, $token, $expired);
$stmt->execute();
$link = "https://situsanda.com/reset.php?token=$token";
// kirim email berisi $link (pakai PHPMailer)
mail($email, "Reset Password", "Klik untuk reset: $link");
}
echo "Jika email terdaftar, tautan reset telah dikirim.";
}
?>
Perhatikan pesan yang netral (“jika email terdaftar…”) agar penyerang tidak bisa menebak email mana yang terdaftar.
Langkah 3: Form Reset (Verifikasi Token)
<?php
require "koneksi.php";
$token = $_GET["token"] ?? "";
// cek token valid & belum kedaluwarsa
$stmt = $koneksi->prepare("SELECT email FROM password_reset WHERE token = ? AND expired_at > NOW()");
$stmt->bind_param("s", $token);
$stmt->execute();
$data = $stmt->get_result()->fetch_assoc();
if (!$data) {
die("Token tidak valid atau sudah kedaluwarsa.");
}
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$password = password_hash($_POST["password"], PASSWORD_DEFAULT);
$upd = $koneksi->prepare("UPDATE users SET password = ? WHERE email = ?");
$upd->bind_param("ss", $password, $data["email"]);
$upd->execute();
// hapus token agar tidak dipakai ulang
$koneksi->query("DELETE FROM password_reset WHERE token = '" . $koneksi->real_escape_string($token) . "'");
echo "Password berhasil diubah! Silakan login.";
}
?>
<form method="post">
<input type="password" name="password" placeholder="Password baru" required>
<button type="submit">Simpan</button>
</form>
Poin Keamanan Penting
- Token acak & panjang dengan
random_bytes()(bukan angka mudah ditebak). - Masa berlaku terbatas (misal 1 jam) lewat kolom
expired_at. - Token sekali pakai — hapus setelah dipakai.
- Simpan password baru dengan
password_hash(), jangan plain.
Kesimpulan
Anda telah membuat fitur lupa dan reset password PHP dan MySQL yang aman berbasis token dengan masa berlaku. Untuk pengiriman email yang andal (tidak masuk spam), gunakan PHPMailer via SMTP. Fitur ini melengkapi sistem login Anda menjadi lebih profesional.
Referensi: untuk pendalaman, kunjungi dokumentasi resmi PHP (php.net).

