Dalam sistem keamanan modern, proses verifikasi email menjadi langkah penting untuk memastikan bahwa pengguna benar-benar memiliki akses ke alamat email yang digunakan. Namun, sering kali pengguna tidak menyelesaikan proses konfirmasi, sehingga data email yang belum diverifikasi bisa menumpuk dan menimbulkan risiko keamanan. Untuk mengatasi hal tersebut, kita dapat menerapkan token expiry di PHP yaitu sistem yang secara otomatis membatalkan atau menonaktifkan email baru jika tidak dikonfirmasi dalam waktu tertentu, misalnya 24 jam. Dengan cara ini, Anda bisa menjaga agar data pengguna tetap bersih dan aman dari penyalahgunaan email palsu atau spam.
Struktur Tabel Database
Tambahkan kolom yang dibutuhkan dalam tabel email_change_requests (atau tabel sejenis):
CREATE TABLE email_change_requests (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
new_email VARCHAR(255) NOT NULL,
token VARCHAR(100) NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
is_verified TINYINT(1) DEFAULT 0,
expired_at DATETIME
);
Keterangan:
-
tokendigunakan untuk verifikasi melalui link email. -
expired_atberisi waktu kadaluarsa token (misalnya 24 jam setelah pembuatan). -
is_verifiedmenandakan apakah email sudah dikonfirmasi.
Membuat Token dengan Waktu Kadaluarsa
Saat user mengajukan perubahan email, sistem akan membuat token verifikasi baru dan menetapkan waktu kedaluwarsanya.
$user_id = $_SESSION['user_id'];
$new_email = $_POST['new_email'];
$token = bin2hex(random_bytes(16));
$expired_at = date('Y-m-d H:i:s', strtotime('+24 hours'));
$stmt = $conn->prepare("INSERT INTO email_change_requests (user_id, new_email, token, expired_at) VALUES (?, ?, ?, ?)");
$stmt->bind_param("isss", $user_id, $new_email, $token, $expired_at);
$stmt->execute();
Kemudian kirim link verifikasi melalui email menggunakan PHPMailer:
$verify_link = "https://yourwebsite.com/verify_email.php?token=$token"; $mail->Body = " <h3>Konfirmasi Perubahan Email</h3> <p>Klik tautan di bawah ini untuk mengonfirmasi email baru Anda:</p> <a href='$verify_link'>$verify_link</a> <p><i>Tautan ini akan kadaluarsa dalam 24 jam.</i></p> "; $mail->send();
Mengecek Token Saat Verifikasi
Di halaman verify_email.php, sistem perlu memastikan bahwa token masih aktif (belum kadaluarsa) dan belum diverifikasi sebelumnya.
$token = $_GET['token'];
$stmt = $conn->prepare("SELECT * FROM email_change_requests WHERE token = ? AND is_verified = 0 LIMIT 1");
$stmt->bind_param("s", $token);
$stmt->execute();
$result = $stmt->get_result();
$request = $result->fetch_assoc();
if ($request) {
$current_time = date('Y-m-d H:i:s');
if ($current_time > $request['expired_at']) {
echo "❌ Token sudah kadaluarsa. Silakan ajukan ulang perubahan email.";
} else {
// aktifkan email baru
$update = $conn->prepare("UPDATE users SET email = ? WHERE id = ?");
$update->bind_param("si", $request['new_email'], $request['user_id']);
$update->execute();
// tandai token sudah diverifikasi
$mark = $conn->prepare("UPDATE email_change_requests SET is_verified = 1 WHERE id = ?");
$mark->bind_param("i", $request['id']);
$mark->execute();
echo "✅ Email baru Anda telah berhasil dikonfirmasi.";
}
} else {
echo "Token tidak valid atau sudah digunakan.";
}
Menonaktifkan Email Baru yang Tidak Dikonfirmasi Otomatis
Gunakan cron job atau script terjadwal untuk menjalankan pengecekan setiap beberapa jam agar token yang sudah kedaluwarsa dinonaktifkan secara otomatis.
// file: cleanup_expired_tokens.php
require 'config.php';
$query = $conn->query("SELECT * FROM email_change_requests WHERE is_verified = 0 AND expired_at < NOW()");
while ($row = $query->fetch_assoc()) {
// hapus atau tandai tidak aktif
$delete = $conn->prepare("DELETE FROM email_change_requests WHERE id = ?");
$delete->bind_param("i", $row['id']);
$delete->execute();
// opsional: kirim pemberitahuan ke user
// "Perubahan email Anda dibatalkan karena tidak dikonfirmasi dalam 24 jam."
}
Atur cron job di server:
0 * * * * /usr/bin/php /path/to/cleanup_expired_tokens.php
(Artinya script dijalankan setiap jam untuk memeriksa token kadaluarsa.)
Menampilkan Status di Dashboard User
Di halaman profil pengguna, Anda bisa menampilkan status permintaan email yang masih menunggu konfirmasi:
$user_id = $_SESSION['user_id'];
$stmt = $conn->prepare("SELECT new_email, expired_at FROM email_change_requests WHERE user_id = ? AND is_verified = 0");
$stmt->bind_param("i", $user_id);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
$req = $result->fetch_assoc();
echo "Perubahan email ke <b>{$req['new_email']}</b> masih menunggu konfirmasi. Berlaku sampai: {$req['expired_at']}";
} else {
echo "Tidak ada permintaan perubahan email aktif.";
}
Kesimpulan
Dengan menerapkan token expiry di PHP, Anda dapat menjaga agar sistem verifikasi email tetap aman, efisien, dan bebas dari spam. Pengguna yang tidak menyelesaikan konfirmasi email dalam waktu tertentu akan otomatis dibatalkan, menjaga konsistensi data serta mengurangi risiko penyalahgunaan akun.
Pendekatan ini dapat dikombinasikan dengan sistem notifikasi otomatis via email dan log keamanan pengguna, sehingga seluruh aktivitas perubahan akun tercatat dengan baik.