タグアーカイブ ボット対策

admin-ajax.phpへのボット大量アクセスでCPUが100%になる時の遮断と対策

admin-ajax.phpへのボット大量アクセスでCPUが100%になる時の遮断と対策

admin-ajax.php へのボットの大量リクエストでサーバーの CPU 使用率が 100% に張り付く場合は、一括遮断ではなく攻撃対象の AJAX アクションをログから特定し、不要な処理を止めた上で正規アクセスを通すレート制限を導入するのが現実的な対策だ。

なぜボットは admin-ajax.php を集中的に叩くのか

admin-ajax.php は WordPress が全 AJAX リクエストを受け付ける入口にあたるファイルだ。フォーム送信、商品カートの更新、ハートビート API による自動保存など、フロントエンドと管理画面の両方で使われている。

ボットがここを狙う理由は、ログイン不要でアクセスできる公開エンドポイントでありながら、リクエストごとに WordPress 全体を読み込んで PHP を実行するため、少ないリクエスト数でもサーバー負荷を大きくできる点にある。

URL に action パラメータを付けて呼び出す構造になっており、たとえば問い合わせフォームの送信処理、EC サイトのカート更新、管理画面の自動保存など、あらゆる AJAX 処理がここを通る。ボットはこれを悪用し、処理の重い action を何度も叩いてサーバーを圧迫する。

攻撃対象の AJAX アクションをログから特定する

攻撃対象の AJAX アクションをログから特定する

対策の最初の一歩は、どの action が攻撃されているのかをアクセスログで確認することだ。闇雲に遮断ルールを増やしても、正規のフォームを巻き込むだけで根本解決にはならない。

アクセスログで action パラメータを調べる

Apache なら /var/log/apache2/access.log、nginx なら /var/log/nginx/access.log にリクエスト履歴が残っている。admin-ajax.php を含む行を抽出し、action= の後ろに続く値を集計すると、攻撃対象が見えてくる。

サーバー管理画面からログをダウンロードできる場合も多い。Cloudflare を利用しているなら、分析画面のセキュリティイベントから admin-ajax.php 宛てのリクエストを絞り込み、クエリ文字列を確認する手もある。

STEP 1 アクセスログで admin-ajax.php へのリクエストを抽出する
STEP 2 action パラメータの値を集計して攻撃対象を特定する
STEP 3 不要なアクションを WordPress 側で無効化する
STEP 4 正規アクセスを通すレート制限を導入する

攻撃対象を特定せずに全リクエストを遮断すると、問い合わせフォームが動かなくなる原因になる。必ずログ調査から始めるのが安全だ。

代表的な攻撃対象を把握しておく

攻撃対象になりやすいのは、外部から呼び出せる未ログインユーザー向けの AJAX アクションだ。問い合わせフォームの送信処理、ハートビート API の更新処理、EC サイトのカート更新などが代表例になる。自分のサイトに不要なプラグインが残した action がしばしば悪用される。

正規のフォームを壊さずにレート制限する

正規のフォームを壊さずにレート制限する

すべての admin-ajax.php リクエストにチャレンジ(CAPTCHA や JS チャレンジ)を適用すると、ブラウザ内の JavaScript が裏で送る AJAX リクエストまで巻き込まれ、フォームが正常に動作しなくなる。これが一括チャレンジ方式が失敗する理由だ。

有効なのは、攻撃対象の action だけを条件にしたレート制限だ。単位時間あたりのリクエスト数を IP アドレスごとに制限し、上限を超えたら一時的にブロックする。正規ユーザーのフォーム送信は頻度が低いため、まず引っかからない。

Before 全リクエストにチャレンジを適用
ブラウザ内の AJAX リクエストがチャレンジに引っかかり、問い合わせフォームが送信できなくなる
正規ユーザーまでブロックしてしまう
After 攻撃対象の action だけをレート制限
頻度の低い正規のフォーム送信は通過し、ボットだけが制限を超えてブロックされる
正規ユーザーへの影響を最小限に抑える
一括遮断の失敗例  レート制限による解決

レート制限の閾値は、通常のフォーム送信頻度を大きく上回る値に設定する。たとえば同一 IP から 1 分間に 30 回を超える admin-ajax.php へのリクエストを制限する場合、正規ユーザーが 30 回もフォームを送ることはない。

WordPress側で不要な AJAX アクションを無効化する

WordPress側で不要な AJAX アクションを無効化する

攻撃対象のアクションが自分のサイトで使われていないなら、WordPress のフックを使ってそのアクション自体を止めてしまうのが最も確実だ。リクエストが届いても処理が実行されず、サーバー負荷は大きく下がる。

未ログインユーザー向けのアクションを止める

wp_ajax_nopriv_ から始まるフックは未ログインの訪問者からの AJAX 処理を担当する。使っていない action を特定したら、テーマの functions.php に下のコードを追加して 403 を返すようにする。

add_action('admin_init', function() {
    if (defined('DOING_AJAX') && DOING_AJAX) {
        $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : '';
        if (in_array($action, array('unused_action_1', 'unused_action_2'), true)) {
            wp_die('403 Forbidden', 'Forbidden', array('response' => 403));
        }
    }
}, 1);

action 名はログで特定した値に置き換える。これで、その action へのリクエストは WordPress の初期化直後に拒否され、プラグインのコードが呼ばれる前に処理が終わる。

ハートビート API の負荷を下げる

管理画面や投稿編集画面で自動保存・ロック通知のために heartbeat が一定間隔で動く。編集画面を開きっぱなしにするボットがいると負荷がかさむ。管理画面を普段使わないサイトなら、heartbeat の頻度を下げるか停止する手もある。

add_filter('heartbeat_settings', function($settings) {
    $settings['interval'] = 300;
    return $settings;
});

interval の単位は秒だ。300 にすると編集画面の自動保存間隔が 5 分になり、サーバーへの負荷が大きく減る。完全に止めるのは編集画面のロック機能に影響するため、まず間隔を延ばすところから始めるとよい。

サーバー設定でボットを直接遮断する

サーバー設定でボットを直接遮断する

Cloudflare やサーバーレベルの設定でも、条件付きの遮断やレート制限を入れられる。正規のフォームを止めずにボットだけを弾くには、リファラー情報やリクエスト頻度を条件に使うのがポイントだ。

リファラーを条件に弾く

正規の AJAX リクエストは、自分のサイトのページから送られるため Referer ヘッダーに自ドメインが入る。一方、ボットは Referer なしや偽装した値で送ることが多い。Apache なら .htaccess で Referer を条件に遮断できる。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} /wp-admin/admin-ajax.php
RewriteCond %{HTTP_REFERER} !^https?://example.com/ [NC]
RewriteRule ^ - [F,L]
</IfModule>

これは自ドメイン以外からの Referer を持つ admin-ajax.php リクエストを 403 で拒否する設定だ。example.com の部分は自分のドメインに置き換える。ただし一部のブラウザ設定で Referer が送られないケースもあるため、完全な遮断には向かない。あくまで補助的な対策として使う。

nginx でレート制限する

nginx を使っているなら limit_req ディレクティブで admin-ajax.php 専用のレート制限を定義できる。サーバーブロックに以下の設定を追加する。

limit_req_zone $binary_remote_addr zone=ajax:10m rate=1r/s;

location = /wp-admin/admin-ajax.php {
    limit_req zone=ajax burst=20 nodelay;
    limit_req_status 429;
    fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
    include fastcgi_params;
}

この設定では、同一 IP から 1 秒あたり 1 リクエストを超えると、バースト(突発的な超過)が 20 回まで許容される。超過分は 429(Too Many Requests)で拒否される。正規ユーザーのフォーム送信はこの制限内に収まるが、ボットの連打はすぐに上限を超える。

よくある質問

すべての admin-ajax.php リクエストを遮断してもよいか

やめておいたほうがよい。問い合わせフォーム、カート更新、検索機能など、多くのサイトで admin-ajax.php が使われている。全遮断すると重要な機能が動作しなくなる。

Cloudflare の Bot Fight Mode だけでは不十分なのか

Bot Fight Mode は既知のボットを自動判定して弾く基本的な防御で、未知のボットや単純なスクリプトには効果が薄い。特定のエンドポイントを狙う攻撃には、レート制限やアクション単位の対策を組み合わせる必要がある。

アクセスログの場所がわからない場合はどうするか

レンタルサーバーの管理画面にアクセスログの閲覧機能があることが多い。わからなければサーバー会社のサポートに問い合わせるか、Cloudflare の分析画面でリクエスト履歴を確認するとよい。

ボット対策プラグインだけでも解決できるか

Wordfence や Limit Login Attempts Reloaded のようなセキュリティプラグインは総合的な保護を提供するが、admin-ajax.php への大量アクセスには専用のレート制限やサーバー設定のほうが効果的な場合が多い。プラグインとサーバー設定の併用が望ましい。

この記事のポイント

  • admin-ajax.php は公開エンドポイントで、ボットが少ないリクエスト数でも負荷をかける
  • まずアクセスログで action パラメータを集計し、攻撃対象を特定する
  • 一括チャレンジは正規フォームを壊すため、action 単位のレート制限を使う
  • 使っていない AJAX アクションは functions.php から 403 で拒否する
  • サーバー設定(.htaccess や nginx)でも Referer 条件や limit_req で守れる
ボットトラフィックの見極め方:人間・善玉・悪玉ボットを識別しサイト運営を最適化する

ボットトラフィックの見極め方:人間・善玉・悪玉ボットを識別しサイト運営を最適化する

Webサイトのアクセス数が増加しているにもかかわらず、コンバージョンや収益が伸び悩む現象は珍しくない。多くの場合、その原因は「人間ではないトラフィック」の混入にある。自動化されたプログラム、いわゆるボットによる通信は、現代のインターネットにおいて無視できない規模に達している。

2025年の調査レポートによれば、2024年の全Webトラフィックの51%を自動化されたシステムが占めていた。これは過去10年間で初めて、ボットによるリクエストが人間の訪問者を上回ったことを示している。未対策のままでは、アクセス解析のデータは実態とかけ離れたものになり、経営判断を誤らせるリスクがある。

本記事では、Webサイトに訪れるトラフィックを「人間」「善玉ボット」「悪玉ボット」の3つに分類し、それらを識別する方法を解説する。正確なデータに基づいたサイト運営と、インフラ資源の適正な配分を実現するための指針を提示する。

ボットトラフィックの正体と3つの分類

ボットトラフィックの正体と3つの分類

ボットトラフィックとは、ブラウザを操作する人間ではなく、自動化されたソフトウェアによって生成されるリクエストのことだ。これらのプログラムは、人間と同じようにWebページや画像、スクリプト、APIに対してリクエストを送信する。サーバー側から見れば、一見すると通常の訪問者と区別がつかないことも多い。

自動化がインターネットを支える側面

自動化そのものは、必ずしも有害なものではない。現在のインターネットは、Webサイトの稼働状況を監視し、データを収集し、検索エンジンにインデックスさせるための自動システムに依存している。重要なのは、その通信が「なぜ」行われているかという意図を把握することだ。ボットを一括りに排除するのではなく、その役割に応じて分類して管理する必要がある。

トラフィックの3つのカテゴリー

サイトに到達するリクエストは、実務上、以下の3つに分けられる。第一に、実際の顧客となる「人間の訪問者」。第二に、検索エンジンや監視ツールなどの「善玉ボット」。そして第三に、脆弱性を探ったりコンテンツを盗用したりする「悪玉ボット」だ。これらを正しく識別できれば、セキュリティを強化しつつ、SEOや利便性を損なわない運用が可能になる。

人間のトラフィックと「善玉ボット」の特徴

人間のトラフィックと「善玉ボット」の特徴

人間の訪問者と有益な自動化プログラムには、それぞれ特有の行動パターンがある。これらを理解することは、トラフィックの健全性を評価する第一歩となる。

不規則で予測困難な人間の動き

人間のアクセスは、極めて不規則だ。ページをスクロールする深さ、リンクをクリックするまでの時間、滞在の長さなどは、人によって千差万別である。同じ広告キャンペーンから流入したユーザーであっても、全く同じ順序でページを遷移することはまずない。また、使用するデバイスやブラウザ、画面サイズ、接続環境も多様であり、データにばらつきが生じるのが自然な状態だ。

サイトの成長を助ける善玉ボット

善玉ボットは、サイトの認知度向上や運営の維持に欠かせない。代表的な例は、GoogleやBingなどの検索エンジンクローラーだ。これらは新しいコンテンツを見つけ、検索結果に反映させるために巡回してくる。クローラーは通常、`robots.txt`で指定されたルールを遵守し、サーバーに過度な負荷をかけないよう制御されている。

また、サイトの死活監視(Uptime Monitor)やパフォーマンス計測ツールも、定期的にリクエストを送信する。これらは数分おきに正確な間隔でアクセスしてくるが、User Agent(ユーザーエージェント:アクセス元の識別情報)を明示していることが多いため、識別は比較的容易だ。これらのアクセスを遮断してしまうと、検索順位の低下や異常検知の遅れを招くことになる。

リスクを引き起こす「悪玉ボット」の脅威

リスクを引き起こす「悪玉ボット」の脅威

一方で、悪玉ボットはサイトの資源を浪費させ、セキュリティリスクを増大させる。これらは正体を隠し、防御策を回避しようとする傾向がある。

不正ログインと脆弱性スキャン

最も一般的な脅威の一つが、リスト型攻撃(クレデンシャルスタッフィング)や総当たり攻撃(ブルートフォース)だ。盗まれたユーザー名とパスワードのリストを使い、ログイン画面に対して高速で試行を繰り返す。たとえログインに失敗しても、大量のリクエストによってサーバーのCPUやメモリが消費され、一般ユーザーの表示速度が低下する原因となる。

また、脆弱性スキャナーは、古いプラグインや設定ミスがないか、サイト内のディレクトリを片っ端から調査する。放置しておくと、攻撃の足がかりを与えてしまうことになる。

スクレイピングとDDoS攻撃

スクレイピングボットは、サイト上の価格情報や独自コンテンツを無断で収集し、他サイトで再利用するために動く。これにより、独自の価値が損なわれるだけでなく、帯域幅(通信容量)が無駄に消費される。さらに、特定のページにリクエストを集中させてサービスを停止させるDDoS攻撃(分散型サービス拒否攻撃)も、ボットネットを通じて行われる。これらはビジネスの継続性に直接的な打撃を与える。

トラフィックを正確に識別するための5つの指標

トラフィックを正確に識別するための5つの指標

人間とボットを完璧に見分ける単一の指標は存在しない。複数の信号を組み合わせて評価することが、精度の高い識別につながる。元記事の著者は、以下の5つのポイントに注目すべきだと指摘している。

1. リクエストの頻度とタイミング

人間は記事を読み、考え、次の行動に移るため、リクエストの間隔が数秒から数分空くのが普通だ。対して、ボットはミリ秒単位の正確な間隔でアクセスしたり、一瞬のうちに数十ページを読み込んだりする。このような超人的なスピードや、機械的な規則性はボットの典型的な兆候だ。

2. User Agent(ユーザーエージェント)の検証

善玉ボットは自身の名前を名乗るが、悪玉ボットは一般的なChromeやSafariなどのブラウザを装う(偽装)ことが多い。しかし、ブラウザの情報を偽っていても、その背後にある挙動が不自然であれば、偽装を見破ることができる。複数のリクエストでUser Agentを頻繁に変更している場合も注意が必要だ。

3. IPレピュテーションとネットワーク属性

アクセス元のIPアドレスが、データセンターやクラウドホスティング、プロキシサーバーのものである場合、それは人間ではなく自動化されたシステムである可能性が高い。通常のユーザーは、ISP(インターネットサービスプロバイダー)経由でアクセスしてくるからだ。過去に攻撃に関与したIPアドレスのデータベース(レピュテーション)と照合することも有効だ。

4. 地理的分布の異常

本来のターゲット層ではない国や地域から、突然大量のアクセスが発生した場合、それはボットネットによる攻撃やスキャンの可能性が高い。特に、その地域の言語設定とブラウザの情報が一致しない場合は、ボットである疑いが強まる。

5. robots.txtへの対応

サイトのルートディレクトリにある`robots.txt`は、ボットに対する「立ち入り禁止区域」の指示書だ。善玉ボットはこのルールを守るが、悪玉ボットはこれを無視して禁止されたパスにアクセスする。この挙動は、ボットの「行儀の良さ」を判断する明確な基準となる。

ボットがアクセス解析と意思決定に与える影響

ボットがアクセス解析と意思決定に与える影響

ボットトラフィックを排除せずに放置すると、マーケティング戦略そのものが歪められる恐れがある。数字上の「成長」に騙されないための視点が必要だ。

歪められるエンゲージメント指標

ボットはページを開いてすぐに離脱したり、逆に特定のページを何度も読み込んだりする。これにより、直帰率や平均滞在時間が異常な値を示す。特定の記事が非常に人気があるように見えても、実はスクレイピングボットが巡回していただけというケースは少なくない。これに基づいたコンテンツ制作は、実際の読者のニーズを反映しないものになってしまう。

インフラコストとリソースの浪費

Webサイトのホスティング費用は、転送量やリクエスト数、サーバー負荷に基づいて決まることが多い。トラフィックの半分以上が価値を生まないボットであれば、その分のコストは純粋な損失となる。また、ボットへの対応でサーバーが重くなれば、本来大切にすべき人間のユーザーがサイトを離れてしまい、コンバージョン機会を逃すという二重の損失を招く。

効果的なトラフィック管理のベストプラクティス

効果的なトラフィック管理のベストプラクティス

現代のWebサイト運営において、ボットを完全にゼロにすることは不可能に近い。現実的な目標は、ボットを適切に管理・制御し、人間への影響を最小限に抑えることだ。

階層的な防御策の導入

まず、CDN(コンテンツ配信ネットワーク)やWAF(Webアプリケーションファイアウォール)を導入し、サーバーに到達する前の「エッジ」段階で悪質なリクエストを遮断するのが効率的だ。これにより、サーバーの負荷を劇的に軽減できる。また、ログイン画面など特定の場所には、ボットにのみ課題を出す「セキュリティチャレンジ」を設けることも有効だ。

行動ベースの制限(レートリミット)

特定のIPアドレスから短時間に大量のリクエストがあった場合に、一時的にアクセスを制限する「レートリミット」は強力な武器になる。これは静的な拒否リストとは異なり、現在の挙動に基づいて動的に判断するため、新しい攻撃手法にも柔軟に対応できる。ただし、善玉ボットまで遮断しないよう、除外設定を丁寧に行うことが重要だ。

定期的なログ分析と方針の見直し

ボットの技術は日々進化しており、AIを使ったより人間らしい挙動を見せるものも現れている。一度設定して終わりにするのではなく、定期的にサーバーログやアクセス解析を確認し、新しいパターンのボットが紛れ込んでいないかチェックする必要がある。ホスティングサービスの管理画面で提供される分析ツールを活用し、トラフィックの内訳を常に把握しておくことが、健全なサイト運営の鍵となる。

この記事のポイント

  • 現代のWebトラフィックの約半分はボットであり、人間とボットの識別は正確なデータ分析に不可欠である。
  • ボットは、SEOを助ける「善玉(クローラー等)」と、攻撃や盗用を行う「悪玉」に分け、それぞれ異なる対応が必要だ。
  • リクエストの間隔、IPアドレスの属性、robots.txtへの準拠状況などが、ボットを見分ける重要な指標となる。
  • 未対策のボットトラフィックは、サーバーコストを増大させ、マーケティング上の意思決定を誤らせるリスクがある。
  • CDNやWAFを活用した階層的な防御と、挙動ベースのレートリミット導入が、最も効果的な管理手法である。

出典

  • Kinsta Blog「How to distinguish traffic from bots to identify real visits, helpful bots, and harmful attacks」(2026年3月17日)
  • Imperva「2025 Bad Bot Report」(2025年発表)