Tạo hệ thống 2FA – Xác thực 2 yếu tố đơn giản cho WordPress

Xác thực hai yếu tố (2FA) là một phương pháp bảo mật mạnh mẽ, yêu cầu người dùng cung cấp hai yếu tố để xác thực danh tính của họ. Một yếu tố là mật khẩu, yếu tố còn lại có thể là mã OTP (mã một lần) được gửi qua email hoặc ứng dụng như Google Authenticator. Bài viết này sẽ hướng dẫn bạn cách tự tạo hệ thống 2FA đơn giản cho trang WordPress mà không cần cài đặt plugin.

Tạo hệ thống 2FA – Xác thực 2 yếu tố đơn giản cho WordPress

Bước 1: Cài đặt mã xác thực (OTP) qua email

Đầu tiên, chúng ta sẽ cần một hàm để gửi mã OTP qua email khi người dùng đăng nhập vào trang WordPress.

1.1. Tạo hàm gửi mã OTP qua email

Thêm đoạn mã sau vào file functions.php của theme hoặc một plugin tùy chỉnh của bạn:

// Tạo mã OTP và gửi qua email
function send_otp_to_user($user_email) {
    $otp = rand(100000, 999999);  // Tạo mã OTP ngẫu nhiên 6 chữ số
    update_user_meta(get_current_user_id(), 'user_otp', $otp);  // Lưu OTP vào user_meta

    // Nội dung email gửi OTP
    $subject = 'Mã OTP xác thực của bạn';
    $message = 'Mã OTP của bạn là: ' . $otp;

    wp_mail($user_email, $subject, $message);  // Gửi email
}

1.2. Tạo một hàm kiểm tra mã OTP khi đăng nhập

Chúng ta sẽ cần một form để người dùng nhập mã OTP khi đăng nhập.

// Kiểm tra mã OTP
function check_user_otp($user_login, $user) {
    if (isset($_POST['otp'])) {
        $input_otp = $_POST['otp'];
        $stored_otp = get_user_meta($user->ID, 'user_otp', true);

        if ($input_otp != $stored_otp) {
            wp_logout();  // Nếu mã OTP sai, logout user
            wp_redirect(home_url());  // Quay lại trang chủ
            exit;
        }
    }
}
add_action('wp_login', 'check_user_otp', 10, 2);

Bước 2: Tạo Form nhập mã OTP

Để người dùng có thể nhập mã OTP, bạn cần một form xuất hiện sau khi họ đăng nhập. Đoạn mã dưới đây sẽ thêm một form nhập mã OTP vào trang đăng nhập WordPress.

2.1. Tạo form OTP trên trang đăng nhập

Chỉnh sửa file functions.php để thêm form này vào trang đăng nhập:

// Thêm form nhập OTP vào trang đăng nhập
function otp_input_form() {
    if (!is_user_logged_in()) return;  // Chỉ hiển thị cho người dùng đã đăng nhập

    echo '<div class="otp-form">';
    echo '<form action="' . esc_url($_SERVER['REQUEST_URI']) . '" method="POST">';
    echo '<label for="otp">Nhập mã OTP đã gửi tới email của bạn:</label>';
    echo '<input type="text" name="otp" id="otp" required />';
    echo '<input type="submit" value="Xác nhận" />';
    echo '</form>';
    echo '</div>';
}
add_action('login_form', 'otp_input_form');

Bước 3: Thêm mã OTP vào trang đăng nhập

Để đảm bảo mã OTP được gửi khi người dùng cố gắng đăng nhập, bạn cần thêm một bước gửi mã OTP khi người dùng thực hiện đăng nhập thành công.

3.1. Tự động gửi OTP khi người dùng đăng nhập thành công

// Gửi mã OTP khi đăng nhập thành công
function send_otp_on_login($user_login, $user) {
    $user_email = $user->user_email;
    send_otp_to_user($user_email);  // Gửi mã OTP đến email
}
add_action('wp_login', 'send_otp_on_login', 10, 2);

Bước 4: Kiểm tra và xử lý mã OTP

Khi người dùng nhập mã OTP vào form và nhấn “Xác nhận”, hệ thống sẽ kiểm tra mã OTP họ nhập vào với mã đã gửi qua email.

4.1. Cập nhật mã kiểm tra trong hàm check_user_otp()

// Kiểm tra mã OTP khi người dùng nhập
function check_user_otp($user_login, $user) {
    if (isset($_POST['otp'])) {
        $input_otp = $_POST['otp'];
        $stored_otp = get_user_meta($user->ID, 'user_otp', true);

        if ($input_otp != $stored_otp) {
            wp_logout();  // Nếu mã OTP sai, logout user
            wp_redirect(home_url());  // Quay lại trang chủ
            exit;
        } else {
            delete_user_meta($user->ID, 'user_otp');  // Xóa mã OTP sau khi xác thực thành công
        }
    }
}

Bước 5: Đảm bảo bảo mật

Để đảm bảo rằng hệ thống này hoạt động hiệu quả, bạn nên áp dụng các biện pháp bảo mật sau:

  • Mã OTP có thời gian sống ngắn: Để tránh tình trạng lạm dụng, mã OTP chỉ có thể sử dụng trong một khoảng thời gian nhất định (ví dụ: 5 phút).

  • Giới hạn số lần nhập sai mã OTP: Cần giới hạn số lần nhập sai mã OTP để tránh việc tấn công kiểu brute force.

Kết luận

Hệ thống xác thực hai yếu tố (2FA) tự tạo trên WordPress sẽ giúp bảo vệ tài khoản của bạn tốt hơn mà không cần sử dụng plugin. Tuy phương pháp này không có nhiều tính năng nâng cao như các plugin 2FA khác, nhưng vẫn đủ để nâng cao mức độ bảo mật cho trang web của bạn.

Hãy chắc chắn rằng bạn luôn cập nhật và cải thiện mã của mình để bảo vệ người dùng khỏi các cuộc tấn công.

Bình Luận


  • Không có bình luận.