Ẩn Trang đăng nhập wp của bạn khỏi Bots

Ẩn trang wp-login.php của trang web WordPress của bạn khỏi bot. Chuyển hướng đến trang 404 của trang web của bạn hoặc chuyển hướng đến một biểu mẫu đăng nhập giao diện người dùng thay thế. Bản thân tôi thích chuyển hướng 404 hơn vì nó khó hiểu hơn đối với Bots 🙂

Bạn sẽ cần sử dụng một chủ đề con tùy chỉnh để có thể thực hiện các thay đổi đối với tệp functions.php của mình.

Tại sao chúng ta nên ẩn trang wp-login.php?

Internet đầy Bots. Các chương trình liên tục quét các trang web để tìm các lỗ hổng đã biết để chúng có thể xâm nhập vào. Bởi vì WordPress là một CMS cực kỳ phổ biến, vô số Botnet nhắm mục tiêu đến các trang web WordPress. Nếu họ tìm thấy một plugin đã được cài đặt một plugin tinh ranh đã biết, hoặc có thể là một phiên bản cũ của WordPress, họ sẽ khai thác điều đó trong bộ giáp.

Một điều khác mà Botnet tìm kiếm là bảo mật mật khẩu yếu. Nếu một Bot có thể lấy danh sách người dùng của một trang web (liệt kê những người dùng WordPress), thì nó có thể lặp qua tên người dùng và thử một số mật khẩu nổi tiếng, chẳng hạn như “password1234”. Nếu mất 1 giây để thử kết hợp tên người dùng / mật khẩu thì Bot có thể thực hiện 3600 lần đoán mỗi giờ - tức là 79,800 lần đoán mỗi ngày. Tỷ lệ cược là ít nhất đoán trong số 79.800 sẽ hoạt động với “password1234”.

NHƯNG… Nếu chúng tôi có thể điều chỉnh trang web của mình để www.example.org/ wp-login.php trả về trang “404 Not Found”, Bots sẽ từ bỏ và bắt đầu quét trang web tiếp theo trên radar của nó.

Chuyển hướng tệp wp-login.php của bạn đến trang “404 Not Found” không phải là một cách kỳ diệu để làm cho trang web của bạn an toàn hơn. Đó chỉ là một cách đơn giản để cố gắng giảm số lần đăng nhập Bot.

Hãy viết một số mã

Đảm bảo rằng bạn có thể đăng nhập vào trang web của mình mà không cần sử dụng trang wp-login.php chuẩn! Bạn có thể làm điều này nếu bạn đang sử dụng WooCommerce, Ultimate Member hoặc bất kỳ plugin nào khác cung cấp cách đăng nhập riêng.

Trong thư mục của chủ đề con tùy chỉnh của bạn, hãy tạo một tệp mới có tên là functions-redirect-login.php và dán phần sau vào đó.

/**
 * Redirect wp-login.php to either a 404 page or an alternative login URL from
 * something like WooCommerce.
 *
 * To enable the login redirect, put the following in your functions.php file.
 *
 * define('HW_IS_LOGIN_REDIRECT_ENABLED', true);
 *
 * If you want to redirect to an alternative URL instead of ot a 404, enable
 * the option like this:
 *
 * define('HW_IS_LOGIN_REDIRECT_TO_URL_ENABLED', true);
 *
 */
// Block direct access.
if (!defined('WPINC')) {
   exit('Do NOT access this file directly.');
}
function custom_get_is_showing_wp_login() {
   return (strpos($_SERVER["SCRIPT_NAME"], "/wp-login.php") === 0);
}
function custom_get_is_login_redirect_enabled() {
   return defined('HW_IS_LOGIN_REDIRECT_ENABLED') &&
      (HW_IS_LOGIN_REDIRECT_ENABLED === true);
}
function custom_get_login_redirect_to_url_enabled() {
   return defined('HW_IS_LOGIN_REDIRECT_TO_URL_ENABLED') &&
      (HW_IS_LOGIN_REDIRECT_TO_URL_ENABLED === true);
}
function custom_get_is_wp_login_being_attempted() {
   $request_uri = $_SERVER['REQUEST_URI'];
   return custom_get_is_showing_wp_login() &&
      (strpos($request_uri, 'action=') === false) &&
      (strpos($request_uri, 'checkemail=confirm') === false);
}
function custom_get_is_wp_lostpassword_being_attempted() {
   $request_uri = $_SERVER['REQUEST_URI'];
   return custom_get_is_showing_wp_login() && (
      (strpos($request_uri, 'action=lostpassword') !== false)
      ||
      (strpos($request_uri, 'action=resetpass') !== false)
      ||
      (strpos($request_uri, 'action=rp') !== false)
      ||
      (strpos($request_uri, 'checkemail=confirm') !== false)
   );
}
function custom_get_login_redirect_url() {
   $login_redirect_url = null;
   // if ($is_login_redirect_to_url_enabled) {
   if (function_exists('wc_get_page_permalink')) {
      // WooCommerce login URL
      $login_redirect_url = wc_get_page_permalink('myaccount');
   } elseif (function_exists('UM') && !empty($login_page_id = UM()->options()->get('core_login'))) {
      // UltimateMember login URL
      $login_redirect_url = get_permalink($login_page_id);
   } else {
      // TODO. Check for BuddyPress login URL?
      // else...
      // TODO. Check for alternative login URL?
      // etc...
   }
   // }
   return $login_redirect_url;
}
function custom_redirect_login() {
   $is_login_redirect_enabled = custom_get_is_login_redirect_enabled();
   $is_login_redirect_to_url_enabled = custom_get_login_redirect_to_url_enabled();
   $is_login_being_attempted = custom_get_is_wp_login_being_attempted();
   if ($is_login_redirect_enabled && $is_login_being_attempted) {
      $login_redirect_url = null;
      if ($is_login_redirect_to_url_enabled) {
         $login_redirect_url = custom_get_login_redirect_url();
      }
      if (!empty($login_redirect_url)) {
         // Redirect to a an alternative URL.
         wp_redirect($login_redirect_url);
         exit;
      } else {
         // Redirect to a 404.
         $GLOBALS['wp_query']->set_404();
         status_header(404);
         nocache_headers();
         include get_query_template('404');
         exit;
      }
   }
}
add_action('init', 'custom_redirect_login');
function custom_login_url($login_url, $redirect, $force_reauth) {
   $is_login_redirect_enabled = custom_get_is_login_redirect_enabled();
   $is_lost_password_being_attempted = custom_get_is_wp_lostpassword_being_attempted();
   if ($is_login_redirect_enabled &&
      $is_lost_password_being_attempted &&
      !empty($login_redirect_url = custom_get_login_redirect_url())
   ) {
      $login_url = $login_redirect_url;
   }
   return $login_url;
}
add_filter('login_url', 'custom_login_url', 10, 3);

Sau đó, bạn chỉ cần bao gồm tệp này từ tệp functions.php của chủ đề con tùy chỉnh của bạn , như sau:

// Redirect wp-login.php to our standard 404 page.
define('HW_IS_LOGIN_REDIRECT_ENABLED', true);
require_once 'functions-redirect-login.php';

Logic khá đơn giản và chạy như thế này:

  • Có ai đó đang cố tải wp-login.php ngay bây giờ không?
  • Nếu HW_IS_LOGIN_REDIRECT_ENABLED được bật, hãy tìm hiểu xem chúng tôi đang chuyển hướng đến URL đăng nhập thay thế hay đến trang 404 của trang web.
  • Nếu ai đó đang cố gắng đặt lại mật khẩu của họ thì ĐỪNG chuyển hướng - hãy để WordPress hoạt động bình thường. Có lẽ có một cách rõ ràng hơn để thực hiện việc kiểm tra này. Hãy bình luận dưới đây!
  • Nếu chúng tôi đang chuyển hướng đến một URL thì hãy thử tìm một URL bằng cách kiểm tra WooCommerce, UltimateMember, v.v.
  • Sau đó, chúng tôi chỉ thực hiện chuyển hướng thực tế.
Bạn sẽ thấy gần trên cùng nơi chúng tôi đang đặt giá trị cho is_login_attempted , chúng tôi kiểm tra xem liệu “action =” có được chỉ định trong URL hay không. Nếu “action =” nằm ở đâu đó trong chuỗi truy vấn thì chúng tôi không thực hiện bất kỳ nội dung chuyển hướng nào. Điều này có nghĩa là bạn vẫn có thể làm những việc như vậy mà không cần chuyển hướng…
/wp-login.php?action=lostpassword

… Hoặc thậm chí là…

/wp-login.php?action=blahblahblah

… Sẽ cho phép bạn quay lại trang đăng nhập tiêu chuẩn nếu bạn cần.

Thực hiện một số thử nghiệm. Tôi không tìm thấy bất kỳ vấn đề nào với bản mod này, nhưng bạn nên đảm bảo rằng liên kết Đặt lại Mật khẩu vẫn hoạt động cho các thành viên của bạn.

Đó là nó cho đoạn mã WordPress nhỏ này. Hãy vui vẻ khi đánh lừa những Bots!