最終更新日:
公開日:
WordPress
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」へ置き換えています。
以上で一通りの設定完了です。
ログイン画面についてのリスクを軽減することができました。
こちらの記事は役に立ちましたか?
コメントありがとうございます!
運営の参考にさせていただきます。
ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。