ワードプレスのブルートフォースアタックを検出してそのIPを1時間ブロックする簡易的なPHPコード(functions.phpに記載)をご紹介いたします。

ブルートフォースアタックでサイトの速度が大きく低下するときがあります

ブルートフォースアタックとは、何万ものパスワードの辞書を使って、サイトへのログインを試みる攻撃の事です。
この攻撃はサイトへの過剰アクセスとデータベースのアクセスを発生させるため、サイトの速度低下や巨大なログファイルが作られてしまう原因となります。

ブルートフォースアタックはwp-login.phpへの過剰なアクセスがサーバーのログなどに記録される為、サーバーのログファイルから調査することも可能ですし、セキュリティープラグインで検出することも可能です。

ブルートフォースアタックをブロックする簡易的なプログラム

ブルートフォースアタックを受けていて、簡易的にその攻撃を検出して止める為のPHPコードをご紹介いたします。(functions.phpに記載すると動作します)

add_action( 'login_init', function() {
    if ( $_SERVER['REQUEST_METHOD'] === 'POST' ) {
        $password = $_POST['pwd'] ?? '';
        if($password = "123456"){
			$user_ip = $_SERVER['REMOTE_ADDR'];
			set_transient( 'blockip_'.$user_ip , $user_ip, HOUR_IN_SECONDS );
		}
    }
});
add_action( 'after_setup_theme', function() {
    $user_ip = $_SERVER['REMOTE_ADDR'];
	if(get_transient( 'blockip_'.$user_ip )==$user_ip){
		wp_die("サイトへのアクセスが1時間ブロックされました");
	}
});

このコードはwp-login.phpのログイン画面にブルートフォースアタックを行ってきたハッカーを1時間ブロックするものです。

add_action( ‘login_init’ でログイン時に送信してきたパスワード文字列が、多くのハッカーが利用しているブルートフォースアタックの辞書にある、123456 という最もよく使われるパスワードかを調べ、もしそうだったらIP(ハッカーのコンピューターの住所)を1時間だけ維持されるtransientに保存します。

次に add_action( ‘after_setup_theme’ でサイトへアクセスしてきたユーザーのIPを取得し、該当のtransient値があるかどうかを調べ、もしあれば、サイトへのアクセスをブロックします。(transientは1時間で自動的に消えますので1時間だけブロックされます)

※本当に123456というパスワードをお使いの場合はログインできなくなってしまいます。123456というパスワードは多くのブルートフォースアタックの辞書に含まれますので決して使用されない事をお勧めいたします!

このコードは簡易的なものであり、wp-login.phpへのブルートフォースアタックがあり過剰なアクセスにお困りの場合は、効果があるかと思います。ただ、ブルートフォースアタックにはxmlrpc.phpへの過剰アクセスを行う物もありますので、より包括的なブルートフォースアタックの検出や、防衛にはセキュリティープラグインをご利用いただくことをお勧めいたします。

WordPress ワードプレスのマルウェア検査駆除、セキュリティー対策のご依頼・ご相談はWPドクターまでお気軽にお送りください