Belajar PHP

7 Langkah Membuat Sistem Reset Password di PHP yang Aman

7 Langkah Membuat Sistem Reset Password di PHP yang Aman

Salah satu fitur wajib dalam aplikasi login adalah sistem Reset Password. Untuk menjaga keamanan, proses ini harus menggunakan token unik yang dikirim melalui email, bukan mengganti password langsung. Artikel ini membahas langkah-langkah lengkap membuat fitur reset password menggunakan PHP dan MySQL.


1. Alur Sistem Reset Password

  1. Pengguna mengisi email pada form “Lupa Password”.
  2. Server membuat token unik.
  3. Token disimpan di database dan dikirim ke email pengguna.
  4. Pengguna klik link reset.
  5. Pengguna membuat password baru.
  6. Password baru disimpan dalam bentuk hash menggunakan password_hash().

2. Struktur Tabel Database

ALTER TABLE users 
ADD reset_token VARCHAR(255) NULL,
ADD reset_expired DATETIME NULL;

3. Form Request Reset Password (HTML)

<form action="send-reset.php" method="post">
  <label>Email Anda:</label><br>
  <input type="email" name="email" required />
  <button type="submit">Reset Password</button>
</form>

4. Kode PHP Mengirim Token Reset (send-reset.php)

<?php
include "db.php";

$email = $_POST['email'];

$cek = $db->prepare("SELECT * FROM users WHERE email = ?");
$cek->execute([$email]);
$user = $cek->fetch();

if (!$user) {
    die("Email tidak ditemukan.");
}

$token = bin2hex(random_bytes(32));
$expired = date("Y-m-d H:i:s", time() + 3600);

$stmt = $db->prepare("UPDATE users SET reset_token=?, reset_expired=? WHERE email=?");
$stmt->execute([$token, $expired, $email]);

$link = "https://domainanda.com/reset-password.php?token=".$token;

mail($email, "Reset Password", "Klik link untuk reset password:\n".$link);

echo "Link reset telah dikirim ke email Anda.";
?>

5. Halaman Reset Password (reset-password.php)

<!doctype html>
<html>
<body>
<form action="update-password.php" method="post">
  <input type="hidden" name="token" value="<?php echo $_GET['token']; ?>" />
  
  <label>Password Baru:</label><br>
  <input type="password" name="password" required />
  
  <button type="submit">Ganti Password</button>
</form>
</body>
</html>

6. Kode PHP Update Password (update-password.php)

<?php
include "db.php";

$token = $_POST['token'];
$password = $_POST['password'];

$cek = $db->prepare("SELECT * FROM users WHERE reset_token=? LIMIT 1");
$cek->execute([$token]);
$user = $cek->fetch();

if (!$user || strtotime($user['reset_expired']) < time()) {
    die("Token tidak valid atau kadaluarsa.");
}

$hash = password_hash($password, PASSWORD_DEFAULT);

$stmt = $db->prepare("UPDATE users SET password=?, reset_token=NULL, reset_expired=NULL WHERE reset_token=?");
$stmt->execute([$hash, $token]);

echo "Password berhasil diperbarui.";
?>

7. Tips Keamanan yang Wajib Dilakukan

  • Token wajib dibuat menggunakan random_bytes() agar tidak bisa ditebak.
  • Gunakan HTTPS agar token tidak bocor.
  • Token harus otomatis hangus setelah digunakan atau setelah kedaluwarsa.
  • Password baru harus di-hash menggunakan password_hash().
  • Jangan pernah kirim password baru lewat email.

Kesimpulan

Sistem reset password di PHP dapat dibuat dengan aman menggunakan token unik yang tersimpan di database. Dengan memanfaatkan fungsi modern seperti random_bytes() dan password_hash(), keamanan data pengguna menjadi jauh lebih kuat. Fitur ini penting untuk semua aplikasi login, membership, dan sistem user berbasis PHP.

Ruang Diskusi

Tinggalkan Komentar

Belum ada komentar. Jadilah yang pertama berkomentar!