この記事は最後に更新してから1年以上経過しています。

ログインページを変える

説明

WordPressの標準的な不正ログイン対策としては、ログインIDは'admin'を避けるパスワードはユニークで長くする、場合によってはアクセスできるIPアドレスを制限する、といった具合だろう。これらの他に何かできないものだろうかと、ちょっと考えてみた。

きっかけは、日々のログに残っていくwp-login.phpのアクセス履歴。まあ、パス名はわかっているのだから、仕方ないないのかもしれない。逆にパス名がわからなければこんなアクセスは激減できるのではないだろうか。

ユニークなログインページを配置する

wp-login.phpの変わりとなる新しいログインページのソースコードは次の通り。

<?php
define( 'ANYWHERE_LOGIN', sha1( 'keyword' ) );
require_once './wp-login.php';
?>

このログインページのファイル名は任意で構わないが、適度に長いファイル名が望ましい(ここでは'anywhere-login.php')。配置場所は、wp-login.phpと同じディレクトリとする。
内容については、'ANYWHERE_LOGIN'を定義し、wp-login.phpを読み込んでいる。'keyword'については、適宜ユニークな文字に書き換えること。

テーマのfunctions.phpを書き換える

本当はプラグイン化すべきかもしれないが、ここは現在のテーマのfunctions.phpを書き換えることにする。追加する内容は次の通りだ。

define( 'ANYWHERE_LOGIN_PAGE', 'anywhere-login.php' );
add_action( 'login_init', 'anywhere_login_init' );
add_filter( 'site_url', 'anywhere_login_site_url', 10, 4 );
add_filter( 'wp_redirect', 'anywhere_login_wp_redirect', 10, 2 );
if ( ! function_exists( 'anywhere_login_init' ) ) {
	function anywhere_login_init() {
		if ( !defined( 'ANYWHERE_LOGIN' ) || sha1( 'keyword' ) != ANYWHERE_LOGIN ) {
			status_header( 403 );
			exit;
		}
	}
}
if ( ! function_exists( 'anywhere_login_site_url' ) ) {
	function anywhere_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'], ANYWHERE_LOGIN_PAGE ) !== false ) )
			$url = str_replace( 'wp-login.php', ANYWHERE_LOGIN_PAGE, $url );
		return $url;
	}
}
if ( ! function_exists( 'anywhere_login_wp_redirect' ) ) {
	function anywhere_login_wp_redirect( $location, $status ) {
		if ( strpos( $_SERVER['REQUEST_URI'], ANYWHERE_LOGIN_PAGE ) !== false )
			$location = str_replace( 'wp-login.php', ANYWHERE_LOGIN_PAGE, $location );
		return $location;
	}
}

ログインページ名は'ANYWHERE_LOGIN_PAGE'で定義し、'keyword'は新設するログインページしたものと同じものを指定すること。任意に変更するポイントはこの2箇所である。

login_initアクションはwp-login.php内で実行されるアクションで、ここでは先に設置したログインページ以外(wp-login.phpを含む)の場合、403エラーにしている。

site_urlフィルターは、ログイン済みか現在のページが今回設置したログインページの場合のみ、wp-login.phpを書き換えている。
ログイン済みの場合に書き換えている理由は、wp-adminディレクトリ以下のページでログアウトできるようにするため。現在のページが今回設置したログインページの場合に書き換えている理由は、入力したIDとパスワードを自身のページで受け取るためである。

wp_redirectフィルターは、ログアウト処理を終わった後に遷移するページを今回設置したログインページに変更している。

ログインからログアウトまでは大丈夫

一応シングルサイトにおいて、、新しいログインページでログインし、管理者ページでログアウトする一通りの動作は検証し、問題なく動作することは確認している(ただしマルチサイトでは未検証)。

制限としては、未ログイン状態でwp-adminディレクトリ以下のページにアクセスした際にログインページにリダイレクトするのだが、これについては新設したログインページが露出しないようwp-login.phpのままにしている(つまり、403エラーになる)。この点はご理解ください。


参考:
Login rebuilder:プラグイン作ってみました(本ページの内容をプラグイン化しました)

最終更新 : 2014年09月12日 14:21


お勧め

wp_save_post_revision(2024年1月10日 更新)

int | WP_Error | void wp_save_post_revision( int $post_id )
現状の投稿のリビジョンを作成する。

get_the_author_posts_link(2019年8月21日 更新)

string get_the_author_posts_link( )
投稿者アーカイブページのリンクを取得する。

get_year_link(2012年2月2日 更新)

string get_year_link( mixed $year )
年アーカイブのURLを取得する。

register_taxonomy(2022年6月1日 更新)

WP_Taxonomy | WP_Error register_taxonomy( string $taxonomy, array | string $object_type, array | string $args = array() )
タクソノミーを登録する。

wp_add_object_terms(2013年8月6日 更新)

mixed wp_add_object_terms( int $object_id, mixed $terms, mixed $taxonomy )
投稿情報などにタクソノミーを追加する。