Dalam artikel ini, kita akan membahas cara menonaktifkan dan mengaktifkan ulang 2FA dengan aman menggunakan PHP. Autentikasi dua faktor (2FA) kini menjadi salah satu standar keamanan penting pada sistem login modern. Namun, ada kalanya pengguna ingin menonaktifkan 2FA, misalnya ketika mengganti perangkat, aplikasi autentikator rusak, atau ingin mengatur ulang sistem keamanannya. Dalam kondisi ini, kita harus memastikan bahwa hanya pengguna yang sah yang bisa mematikan 2FA tersebut dan cara terbaik untuk melindunginya adalah dengan verifikasi ulang password dan token keamanan.
Setiap aksi akan dicek melalui verifikasi password, token CSRF, dan notifikasi email menggunakan PHPMailer agar pengguna mendapatkan pemberitahuan jika 2FA mereka diubah, sama seperti sistem keamanan profesional pada aplikasi besar seperti Google atau GitHub.
Struktur Tabel Database
Kita anggap tabel users sudah memiliki kolom untuk menyimpan status 2FA.
ALTER TABLE users ADD COLUMN two_factor_enabled TINYINT(1) DEFAULT 0, ADD COLUMN two_factor_secret VARCHAR(255) DEFAULT NULL;
Form Menonaktifkan 2FA
Berikan form untuk verifikasi password sebelum 2FA dimatikan.
<form method="POST" action="disable_2fa.php">
<div class="mb-3">
<label for="password">Konfirmasi Password:</label>
<input type="password" name="password" class="form-control" required>
</div>
<input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token']; ?>">
<button type="submit" class="btn btn-danger">Nonaktifkan 2FA</button>
</form>
Proses Menonaktifkan 2FA (disable_2fa.php)
<?php
session_start();
require 'config.php';
require 'vendor/autoload.php'; // PHPMailer
// Validasi CSRF token
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
die("Akses tidak sah!");
}
$user_id = $_SESSION['user_id'];
$password = $_POST['password'];
// Ambil data user
$stmt = $mysqli->prepare("SELECT email, password, two_factor_enabled FROM users WHERE id = ?");
$stmt->bind_param("i", $user_id);
$stmt->execute();
$stmt->bind_result($email, $hash, $twofa);
$stmt->fetch();
$stmt->close();
// Cek password
if (!password_verify($password, $hash)) {
die("Password salah!");
}
// Update status 2FA
$stmt = $mysqli->prepare("UPDATE users SET two_factor_enabled = 0, two_factor_secret = NULL WHERE id = ?");
$stmt->bind_param("i", $user_id);
$stmt->execute();
$stmt->close();
// Kirim notifikasi email
use PHPMailer\PHPMailer\PHPMailer;
$mail = new PHPMailer(true);
try {
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = 'youremail@gmail.com';
$mail->Password = 'yourpassword';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->setFrom('youremail@gmail.com', 'Keamanan Akun');
$mail->addAddress($email);
$mail->isHTML(true);
$mail->Subject = '2FA Telah Dinonaktifkan';
$mail->Body = 'Hai, 2FA pada akun Anda baru saja dinonaktifkan. Jika ini bukan Anda, segera ubah password.';
$mail->send();
} catch (Exception $e) {
error_log("Gagal kirim email: " . $e->getMessage());
}
echo "<div class='alert alert-success'>2FA berhasil dinonaktifkan.</div>";
?>
Mengaktifkan Ulang 2FA
Kamu bisa membuat halaman aktifkan_2fa.php yang meminta pengguna melakukan verifikasi password ulang, lalu menghasilkan secret key baru untuk Google Authenticator atau OTP email.
<?php
// Misalnya user ingin mengaktifkan ulang 2FA
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$password = $_POST['password'];
$stmt = $mysqli->prepare("SELECT password FROM users WHERE id = ?");
$stmt->bind_param("i", $user_id);
$stmt->execute();
$stmt->bind_result($hash);
$stmt->fetch();
$stmt->close();
if (!password_verify($password, $hash)) {
die("Password salah!");
}
// Generate secret baru (misal untuk Google Authenticator)
$new_secret = bin2hex(random_bytes(10));
$stmt = $mysqli->prepare("UPDATE users SET two_factor_secret = ?, two_factor_enabled = 1 WHERE id = ?");
$stmt->bind_param("si", $new_secret, $user_id);
$stmt->execute();
echo "<div class='alert alert-success'>2FA berhasil diaktifkan kembali.</div>";
}
?>
Notifikasi Keamanan Email
Pastikan setiap perubahan status 2FA disertai email alert, agar pengguna tahu jika ada aktivitas mencurigakan di akun mereka.
Contoh isi email:
Subjek: Aktivitas Keamanan: 2FA Diperbarui
Hai [Nama Pengguna],
Kami mendeteksi perubahan pengaturan autentikasi dua faktor (2FA) pada akun Anda.
Jika ini bukan Anda, segera ubah password Anda untuk melindungi akun.
Tips Keamanan Tambahan
-
Gunakan CSRF token di semua form keamanan.
-
Simpan log setiap perubahan keamanan ke tabel
security_logs. -
Tambahkan batas waktu (timeout) untuk form sensitif.
-
Kirim notifikasi ke email lama dan baru saat perubahan dilakukan.
Kesimpulan
Fitur menonaktifkan dan mengaktifkan ulang 2FA sangat penting dalam sistem keamanan login berbasis PHP. Dengan verifikasi password, token CSRF, dan notifikasi email, kamu bisa memastikan hanya pemilik sah akun yang dapat mengubah pengaturan 2FA mereka.
Mengamankan proses ini berarti melindungi pengguna dari ancaman phishing, session hijacking, dan akses ilegal — menjadikan sistem login kamu setara dengan standar keamanan aplikasi modern.