ご存知の通り、WordPressの管理画面へのログインURLは、固定されています。
しかし全Webサイトの40%近くがWordPressで作られる昨今、ログインページをデフォルトのままにしておくと、外部からの攻撃を受けやすくなってしまいます。
ログインページの保護には、Basic認証や2段階認証等他にも様々ありますが、今回はURLを変更する方法をご紹介します。
前提
下記の文字列は、必要に応じて各自変更してください。
ログインページ名:new-login.php
ハッシュ:test-hash
コード
新しいログインページ
プロジェクトルート(wp-login.phpがある階層)に設置する。
new-login.php
<?php
define('LOGIN_KEY', password_hash('test-hash', PASSWORD_BCRYPT, ['cost'=>10]));
require_once './wp-login.php';
functions.phpへのインクルード
他機能と分離するため、functions.php
へは直接記載せずにインクルードするのがおすすめ。
wp-content/themes/theme-name/functions.php
<?php
require_once 'inc/change_login_page.php';
wp-login.phpから新しいログインページへの移管処理
wp-content/themes/theme-name/inc/change_login_page.php
<?php
class ChangeLoginPage
{
private const LOGIN_PAGE = 'new-login.php';
public function __construct()
{
// ログインキーが未定義または不一致の場合、404へリダイレクト
add_action('login_init', [$this, 'admin_login_init']);
// ログイン後のリダイレクト先を指定のログインページへ変更
add_filter('site_url', [$this, 'admin_login_site_url'], 10, 2);
// ログアウトした後のログインページURLを指定のページへ変更
add_filter('wp_redirect', [$this, 'admin_login_wp_redirect'], 10, 1);
}
public function admin_login_init(): void
{
// サイトヘルスのエラー回避のため、サーバーIPによるアクセスはリダイレクトから除外する
$global_ip = rtrim(`curl inet-ip.info 2>/dev/null`);
if($_SERVER['REMOTE_ADDR'] === $global_ip) {
return;
}
if(!defined('LOGIN_KEY') || password_verify('test-hash', LOGIN_KEY) === false) {
header('Location:' . site_url() . '/404.php');
exit;
}
}
public function admin_login_site_url(string $url, string $path): string
{
if(($path === 'wp-login.php' || preg_match('/wp-login\.php\?action=\w+/', $path)) && (is_user_logged_in() || strpos($_SERVER['REQUEST_URI'], self::LOGIN_PAGE) !== false)) {
$url = str_replace('wp-login.php', self::LOGIN_PAGE, $url);
}
return $url;
}
public function admin_login_wp_redirect(string $location): string {
if(is_user_logged_in() && strpos($_SERVER['REQUEST_URI'], self::LOGIN_PAGE) !== false) {
$location = str_replace('wp-login.php', self::LOGIN_PAGE, $location);
}
return $location;
}
}
new ChangeLoginPage;