特定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は最新バージョンに更新しておくことが重要です。
- 国別ブロック機能を利用する場合は、
- 複数のセキュリティプラグインを同時に使用すると、競合してサイトが表示されないことがあるため注意が必要です。
- プラグインを使用する場合でも、WordPressは最新バージョンに更新しておくことが重要です。
- 国別ブロック機能を利用する場合は、
GeoLite2データベースの更新設定を確認しましょう。- 複数のセキュリティプラグインを同時に使用すると、競合してサイトが表示されないことがあるため注意が必要です。
6 まとめ
上記の方法を使えば、特定IP・国・ユーザーエージェントごとにアクセス制限が可能です。重要なのはPHP側で制御することです。JavaScriptのみでは簡単に回避されてしまいますので、必ずサーバーサイドでもチェックしてください。


