WordPressでログイン試行回数の制限機能を実装してセキュリティ強化する方法を解説(プラグインなし)

みなさんこんにちは!エンジニアの高澤です!
今回はWordPressでログイン試行回数の制限機能を実装してセキュリティ強化する方法を解説していきたいと思います。
WordPressのログインページは、不正アクセスの標的になりやすい部分の一つです。特に総当たり攻撃(ブルートフォースアタック)やリスト型攻撃などの手法を使って、不正にログインを試みる攻撃者が増えています。
こうした攻撃を防ぐために、ログイン試行回数を制限する仕組みを導入することは非常に有効です。なんなら必須と言っても過言ではありません。
当記事では、プラグインを使用せずに、WordPressのログイン試行回数を制限する機能を自作する方法を詳しく解説します。ぜひ当記事をご活用いただき、セキュリティを強化して不正アクセスのリスクを最小限に抑えていただければと思います。
WordPressエンジニアの方はもちろん、ブロガーの方やウェブ担当者の方もぜひ当記事をご確認いただき、セキュリティ強化の手段の一つである「ログイン試行回数の制限」について学んでいただけましたら幸いです。
ログイン画面へのセキュリティ的な脅威とは
WordPressのログイン画面は、不正アクセスの標的になりやすい要素の一つです。
特に、総当たり攻撃(ブルートフォースアタック)や辞書攻撃といった手法を使い、自動化されたボット(特定の作業を自動的に実行するプログラム)が無数のユーザー名やパスワードを試すことで、不正ログインを試みるケースが後を絶ちません。
加えて、フィッシング詐欺によるログイン情報の漏えいや、リスト型攻撃(過去に流出したパスワードを使った攻撃)も多発しています。このような脅威に対処するため、適切なセキュリティ対策が求められます。
その中でも、ログイン試行回数の制限は、不正アクセスを未然に防ぐための有効な手段の一つと言えます。以下関連する単語の意味を表にまとめましたので、必ずご確認ください。
総当たり攻撃(ブルートフォースアタック) | 無数のパスワードの組み合わせを総当たりで試し、正しいログイン情報を見つけようとする攻撃。 |
辞書攻撃 | よく使われる単語やフレーズをリスト化し、それを順番に試してパスワードを突破しようとする攻撃。 |
フィッシング詐欺 | 偽のログインページやメールを使ってユーザーを騙し、パスワードや個人情報を盗み取る詐欺。 |
リスト型攻撃 | 過去に流出したIDやパスワードのリストを使い、他のサービスでも不正ログインを試みる攻撃。 |
これら単語と意味を知っているだけでも、全く知らない人との差はかなり違ってきます。
ログイン試行回数の制限とは
ログイン試行回数の制限とは、一定回数以上ログインに失敗したユーザーに対して、一時的にログインを禁止するセキュリティ対策のことを言います。

例えば、5回連続で誤ったパスワードを入力すると、一定時間(例えば15分間)ログインをブロックする仕組みが一般的です。
これにより、総当たり攻撃を試みる悪意のあるユーザーやボットの活動を抑止できます。WordPressでは、プラグインを使わずに独自にこの機能を実装することも可能です。
注意点としてあまりに厳しい条件(例えば、1回間違えたら15分間ログインをブロックなど)を設定してしまうとユーザーの使い勝手が悪くなってしまうため、適度な条件で適切な制限を設けることで、正規のユーザーに過度な負担をかけることなく、不正アクセスのリスクを低減できます。
ログイン試行回数の制限のメリット
ログイン試行回数の制限を導入することで、WordPressサイトのセキュリティが大幅に向上します。
まず、総当たり攻撃を効果的に防ぐことができ、攻撃者が短時間で何度もパスワードを試すことを阻止します。次に、ユーザーのアカウントが不正にアクセスされるリスクを軽減し、サイト全体の安全性を確保できます。
また、ログイン履歴を記録し、不審な試行回数が増えた際に管理者へ警告を送る仕組みも組み合わせることで、より強固なセキュリティ対策が可能になります。
こうした制限を適用することで、サイトの信頼性を高め、管理者やユーザーに安心感を提供できます。
ちなみにログイン履歴を記録する機能の実装方法については以下の記事で解説しておりますので、よろしければご活用ください。
ログイン試行回数が必要な理由
WordPressのログイン試行回数の制限が必要な理由は、主にセキュリティリスクの軽減にあります。
総当たり攻撃を仕掛ける攻撃者は、無数のパスワードの組み合わせを試すことで不正ログインを試みますが、試行回数に制限を設けることで、この攻撃の成功率を大幅に下げることができます。
また、リスト型攻撃にも効果的で、過去に流出したパスワードを利用した不正アクセスを防ぐ手助けとなります。加えて、システムリソースの負担軽減にも貢献し、大量のログイン試行によるサーバー負荷を抑えることができます。
これらの理由から、WordPressサイトを運営する上でログイン試行回数の制限は不可欠なセキュリティ対策の一つです。
ログイン試行回数の制限の実装方法
それでは、ログイン試行回数の制限の実装方法について解説いたします。
まずは実装してしまいましょう。以下のコードをfunctions.phpにコピー&ペーストしてください。
<?php
// ロックアウト設定
define('MAX_LOGIN_ATTEMPTS', 5); // 最大ログイン試行回数(5回まで許可)
define('LOCKOUT_TIME', 60 * 15); // ログイン試行回数を超えた場合のロックアウト時間(15分間ログイン不可)
// ログイン試行回数を増やす
function increase_login_attempts($username) {
$ip_address = $_SERVER['REMOTE_ADDR'];
$attempts = get_transient("failed_login_attempts_{$ip_address}") ?: 0;
$attempts++;
set_transient("failed_login_attempts_{$ip_address}", $attempts, LOCKOUT_TIME);
if ($attempts >= MAX_LOGIN_ATTEMPTS) {
update_option("lockout_time_{$ip_address}", time() + LOCKOUT_TIME);
}
}
add_action('wp_login_failed', 'increase_login_attempts');
// ログイン成功時に試行回数をリセット
function reset_login_attempts($user_login, $user) {
$ip_address = $_SERVER['REMOTE_ADDR'];
delete_transient("failed_login_attempts_{$ip_address}");
delete_option("lockout_time_{$ip_address}");
}
add_action('wp_login', 'reset_login_attempts', 10, 2);
// ログインページアクセス時にロックアウトを確認
function check_login_attempts() {
$ip_address = $_SERVER['REMOTE_ADDR'];
$lockout_end = get_option("lockout_time_{$ip_address}");
if ($lockout_end && time() < $lockout_end) {
$remaining_time = $lockout_end - time();
wp_die("ログイン試行回数を超えました。あと " . round($remaining_time / 60) . " 分後に再試行してください。");
}
}
add_action('login_init', 'check_login_attempts');
上記コードは、5回ログインに失敗したら15分ログインをブロックするコードになります。
ペーストが完了したら、「https://(ご自身のサイトのドメイン)/wp-login.php」のURLへアクセスし、WordPressのログインページを開いてください。

ログインページを開いたら、わざと5回以上適当なIDとパスワードを入力してログインを失敗してください。

ログインを繰り返し失敗していただくと、下図のようにログインページがブロックされるかと思います。

これでログイン試行回数の制限機能の実装は完了です。お疲れ様でした!
現状だと「5回ミスしたら15分間ブロック」という仕様になっておりますが、コードの一部を変更することでこの仕様を変更することができます。
コードの以下の部分の数値を変更することで可能です。
define('MAX_LOGIN_ATTEMPTS', 5); // 最大ログイン試行回数(5回まで許可)
define('LOCKOUT_TIME', 60 * 15); // ログイン試行回数を超えた場合のロックアウト時間(15分間ログイン不可)
例えば、「10回ミスしたら30分間ブロック」としたければ、以下のように修正します。
define('MAX_LOGIN_ATTEMPTS', 10); // 最大ログイン試行回数(5回まで許可)
define('LOCKOUT_TIME', 60 * 30); // ログイン試行回数を超えた場合のロックアウト時間(15分間ログイン不可)
あまり厳しい条件すぎるとユーザーの使い勝手が悪くなってしまいますが、適度にご自身のサイトに合わせて設定していただければと思います。
まとめ
今回は、WordPressでログイン試行回数の制限機能を実装してセキュリティ強化する方法を解説いたしました。
WordPressのログインページは、不正アクセスの標的になりやすく、総当たり攻撃(ブルートフォースアタック)やリスト型攻撃などの脅威に常にさらされています。
こうした攻撃を防ぐために、ログイン試行回数の制限を導入することは必須と言えるでしょう。適切な設定を行うことで、不正アクセスのリスクを大幅に軽減し、WordPressサイトのセキュリティを強化できます。
WordPressエンジニアの方はもちろん、ブロガーの方やウェブ担当者の方も、ぜひ今回の内容をご活用いただき、安全なサイト運営にお役立てください。
セキュリティ対策を徹底し、安心してWordPressを運用していきましょう。
お気軽に皆さんのご要望をお聞かせください!
どんなに些細なことでも構いません!よろしければ記事や当サイトへの「こんな記事があったら仕事とかで役に立つな〜」や「こうだったらもっと役に立つのに!」といったようなご要望等をお気軽にお聞かせください!今後のサービス改善にお役立てさせていただきます!
例1)Reactの技術記事を書いてほしい!
例2)WordPressの使い方とかを初心者向けに解説してほしい!...など