BLOG

WordPress

WordPress管理画面のログインURLを変更する

WordPress管理画面のログインURLを変更する

WordPressは多くの場所で使われている非常に便利なCMSですが、共通ルールがセキュリティとして好ましくないこともあります。そこで今回は、共通ルールの1つである管理用ログイン画面のURLを独自のものにする方法を解説します。

目次

地味に見落としがちな、ログイン画面のURL

管理画面にログインする際、いつもどのようなURLを使っていますか?
URLが「http://example.jp」の場合、次のURLは全てログイン画面を開くことができます。

  • http://example.jp/wp-login.php
  • http://example.jp/wp-admin
  • http://example.jp/login
  • http://example.jp/admin
  • http://example.jp/dashboard

ログインしなければ管理画面を開くことはできませんが、ログイン画面が露出していること自体もリスクです。

そのようなリスクを避けるため、今回は2つのファイルを使ってログイン画面のURLを独自のものに設定していきます。
2つのファイルのうち1つは「wp-login.php」と同じ階層に新規作成し、もう1つはテーマ内の「functions.php」に追記します。

解説の便宜上、新規作成するファイルを「graycode-login.php」、functions.phpがあるテーマのフォルダを「graycode」とします。
設定をする際はご自身の環境に合わせて置き換えてください。

設定するファイル

  • graycode-login.php
  • wp-content/themes/graycode/functions.php

ログイン用ファイルの作成

まずはログインの入り口となるファイルを作成します。
このファイル名が独自のログインURLとなるので、推測しにくいファイル名にしてください。

今回のように「graycode-login.php」としたら、ログインするためのURLはhttp://example.jp/graycode-login.phpとなります。
もしこのファイル名を「abcd.php」など別のものにとしたら、URLもhttp://example.jp/abcs.phpです。
URLは必要に応じて置き換えてください。

早速コードを入力していきましょう。

graycode-login.php

<?php
define('LOGIN_KEY', password_hash( 'test', PASSWORD_BCRYPT, array('cost'=>10)));
require_once './wp-login.php';

ここではこの3行だけ記述します。

2行目のdefine関数ではハッシュ値を生成しています。
この値は、きちんと「graycode-login.php」を通過してきているかを確認する際に使用します。

ハッシュ値の生成で使っているpassword_hash関数は比較的新しい関数で、php5.5以降から使用可能です。
もしphpのバージョンが5.4以前の場合、crypt関数など他のハッシュ生成関数を使ってください。

関数の詳細はこちら
password_hash関数 – PHPドキュメント

WordPressの設定をする

続いてfunctions.phpを編集し、先ほど作成したファイルを入り口となるように設定していきます。

まずはテーマ内のfunctions.phpを開き、次のコードを記述してください。
記述箇所はファイル内の一番下などで大丈夫です。

functions.php

define( 'LOGIN_PAGE', 'graycode-login.php');
add_action( 'login_init', 'admin_login_init');
function admin_login_init()
{
    if( !defined('LOGIN_KEY') || password_verify( 'test', LOGIN_KEY) === false ) {
        header('Location:' . site_url() . '/404.php');
        exit;
    }
}

上の処理では、graycode-login.phpを通ってwp-login.phpLOGIN_KEY定数を使って判定しています。
もし通っていない場合は404.phpへリダイレクトし終了です。

こちらの設定で、wp-login.phpへの直接アクセスはできなくなりました。

もう少し処理を詳しく見ていきましょう。
2行目は「login_init」というwp-login.phpにアクセスした際に呼び出されるアクションに、admin_login_init関数の実行を追加します。
内容は定数LOGIN_KEYが宣言されているか、そしてその定数の内容が正しいかのチェックです。

password_verify関数は先ほどのpassword_hashと対をなす関数で、ハッシュ値の正当性の確認で使用します。
こちらの関数もphp5.5以上からでないと使用できないため注意してください。

関数の詳細はこちら
password_hash関数 – PHPドキュメント

さらに設定を追加

先ほどのコードの下に、さらに次のコードを追加してください。

functions.php

add_filter( 'site_url', 'admin_login_site_url', 10, 4);
function admin_login_site_url( $url, $path, $orig_scheme, $blog_id)
{
    if( ($path == 'wp-login.php' || preg_match( '/wp-login\.php\?action=\w+/', $path) ) && (is_user_logged_in() || strpos( $_SERVER['REQUEST_URI'], LOGIN_PAGE) !== false) ) {
        $url = str_replace( 'wp-login.php', LOGIN_PAGE, $url);
    }
    return $url;
}

add_filter( 'wp_redirect', 'admin_login_wp_redirect', 10, 2);
function admin_login_wp_redirect( $location, $status) {
    if( is_user_logged_in() && strpos( $_SERVER['REQUEST_URI'], LOGIN_PAGE) !== falsee ) {
        $location = str_replace( 'wp-login.php', LOGIN_PAGE, $location);
    }
    return $location;
}

1つ目の「add_filter」ではログイン状態でログイン画面へアクセスした場合の動作を、2つ目の「add_filter」ではログイン画面へのリダイレクトを制御しています。

1つ目の「add_filter」の設定は、ログイン後に管理画面を表示するために行います。
通常はログイン後にwp-login.phpへリダイレクトされますが、上記設定で直接のアクセスを制御しているため404.phpが表示されてしまいます。
そこで、リダイレクトURLからwp-login.phpの指定をファイル名「graycode-login.php」に置き換えています。

2つ目の設定は、ログアウトした後にログイン画面へ戻るために必要な処理です。
ここでもwp-login.phpへの直接アクセスをしないように、URLからwp-login.phpを「graycode-login.php」へ置き換えています。

以上で一通りの設定完了です。
ログイン画面についてのリスクを軽減することができました。

こちらの記事は役に立ちましたか?

ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。

ありがとうございます。
コメントを送信しました。

前のページへ 一覧に戻る 次のページへ