Cara Membuat Fitur Lupa dan Reset Password dengan PHP dan MySQL

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.

Alur Reset Password Aman
Alur Reset Password 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).

Baca Juga

Ali Akbar

Software Developer yang fokus mengembangkan aplikasi berbasis Web dan Desktop. Senang mempelajari teknologi baru terutama di bidang web design dan web development.

View all posts by Ali Akbar →

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *