特定IP・国・ユーザーエージェントごとのアクセス制限、拒否を実装する方法

WordPressサイトで特定のIPアドレスや国、ユーザーエージェント(ブラウザ)からのアクセスを制限したい場合、PHPと少量のJavaScriptを使って実装できます。ここではクラシックエディタでも貼り付け可能なサンプルコードを紹介します。

1 アクセス制限の概要

  • IPアドレスによる制限
  • 国別アクセス制限(GeoIP)
  • ユーザーエージェントによる制限
  • 制限された場合のメッセージ表示

2 functions.phpにコードを追加


// ----------------------------------------
// アクセス制限(IP・Bot・国別)・ログイン拒否
// ----------------------------------------
function custom_access_restriction() {

    // ------------------------------
    // ① IPアドレス制限
    // ------------------------------
    $blocked_ips = array(
        '123.45.67.89',
        '111.222.333.444'
    );

    $user_ip = $_SERVER['REMOTE_ADDR'] ?? '';
    if (in_array($user_ip, $blocked_ips, true)) {
        wp_die('Access from this IP address is restricted.');
    }

    // ------------------------------
    // ② User-Agent(ボット)制限
    // ------------------------------
    $blocked_user_agents = array(
        'AhrefsBot',
        'SemrushBot',
        'MJ12bot',
        'DotBot',
        'BLEXBot',
        'MegaIndex',
        'YandexBot'
    );

    $user_agent = $_SERVER['HTTP_USER_AGENT'] ?? '';

    foreach ($blocked_user_agents as $ua) {
        if (stripos($user_agent, $ua) !== false) {
            wp_die('Access from this crawler is restricted.');
        }
    }

    // ------------------------------
    // ③ 国別アクセス制限(GeoIP2)※存在チェック付き
    // ------------------------------
    $geoip_phar = __DIR__ . '/geoip/geoip2.phar';
    $geoip_db   = __DIR__ . '/geoip/GeoLite2-Country.mmdb';

    if (file_exists($geoip_phar) && file_exists($geoip_db)) {
        require_once $geoip_phar;

        try {
            $reader = new \GeoIp2\Database\Reader($geoip_db);
            $record = $reader->country($user_ip);
            $country_code = $record->country->isoCode;

            $blocked_countries = array('RU', 'KP');

            if (in_array($country_code, $blocked_countries, true)) {
                wp_die('Access from your country is restricted.');
            }
        } catch (\Exception $e) {
            // ログに残すなどしてもOK
            // error_log('GeoIP2 Error: ' . $e->getMessage());
        }
    } else {
        // ファイルが無い場合はスキップ(安全)
        // error_log('GeoIP2 files not found. Skipping country restriction.');
    }
}
add_action('init', 'custom_access_restriction');

3 完成イメージ

アクセス拒否

4 アクセスを制限すべき危険といわれる国コード一覧(ISO 3166-1 alpha-2)

海外からの不正アクセスやスパム、ボットなどを防ぐために、特定の国からのアクセスを制限することがあります。ここではサンプルとして「危険といわれる国」の一覧表を示します。

国名 国コード
ロシア RU
北朝鮮 KP
イラン IR
シリア SY
イラク IQ
リビア LY
ベネズエラ VE
ソマリア SO
スーダン SD

💡 注意:

  • この一覧はあくまでサンプルです。最新の安全性情報やアクセス状況を確認してください。

5 代用プラグイン

コードでのアクセス制限が難しい場合、以下のWordPressセキュリティプラグインを利用すると、同様の機能を簡単に導入できます。

プラグイン名 主な機能・特徴
Wordfence Security 世界的に有名な総合セキュリティプラグイン。IPアドレス制限、国別ブロック、ログイン試行制限、ファイアウォールなどを網羅。
公式プラグインページ
All In One WP Security & Firewall 無料で高機能。管理画面から簡単にアクセス制御を設定でき、ログイン試行回数制限やブラックリスト登録も可能。
公式プラグインページ
iQ Block Country 国別アクセス制限に特化したプラグイン。GeoLite2データベースを利用し、指定国からのアクセスをブロック可能。
公式プラグインページ
補足:
- プラグインを使用する場合でも、WordPressは最新バージョンに更新しておくことが重要です。
- 国別ブロック機能を利用する場合は、GeoLite2データベースの更新設定を確認しましょう。
- 複数のセキュリティプラグインを同時に使用すると、競合してサイトが表示されないことがあるため注意が必要です。

6 まとめ

上記の方法を使えば、特定IP・国・ユーザーエージェントごとにアクセス制限が可能です。重要なのはPHP側で制御することです。JavaScriptのみでは簡単に回避されてしまいますので、必ずサーバーサイドでもチェックしてください。