【GA4対策】中国・蘭州(Lanzhou)とシンガポール(Singapore)からの異常アクセス

2026年1月,GA4で中国・蘭州市(都市ID: 1003629)からの不自然なDirectトラフィックが急増.通常表示されないURLを読み込む悪質なスパムと判明しました.調査時のAI検索の誤情報に注意を促しつつ,正確なデータ分析を維持するために,言語や国を条件としたフィルタリングによる具体的な除外対策を解説します.

 

1.はじめに

本サイトの2026年1月のGA4(Google Analytics 4)のアクセスデータを見ていると,トラフィックでセッションのメインチャネル(デフォルトチャネルグループ)の「Direct」が不自然に急増している日がありました(図1参照).

図1.トラフィックでセッションのメインチャネルの「Direct」が不自然に急増.

図1.トラフィックでセッションのメインチャネルの「Direct」が不自然に急増.

 

当初は本サイトでも何度か紹介した「urlumbrella.com」に関連するリファラスパム(下記の記事参照)かと思ったのですが,それらとは異なる特徴を持つ新たなスパムトラフィックであることが分かりました.

Google Analytics 4でリファラスパムを計測したので対策の設定を行ってみる

Google Analytics 4の「urlumbrella.com」に関連するリファラスパムの対策を再考(前編)

Google Analytics 4の「urlumbrella.com」に関連するリファラスパムの対策を再考(後編)

 

2.異常トラフィックの属性データ

このトラフィックに関係するGA4のデフォルトのディメンションのいくつかの情報を確認したところ,以下のような情報を持つことがわかりました.

  • セッションのメインのチャネルグループ:Direct
  • セッションの参照元/メディア:(direct) / (none)
  • ユーザーの最初のメインのチャネルグループ:Direct
  • 言語:English
  • OSとバージョン:Windows 10
  • 国:China
  • 地域:Gansu
  • 市区町村:Lanzhou

地域の「Gansu」とは中国の「甘粛省(かんしゅくしょう)」のことで,市区町村の「Lanzhou」は蘭州市(らんしゅう-し)で中華人民共和国甘粛省の省都のことです.

図2.蘭州市.

図2.蘭州市.

 

2.都市ID1003629」を巡る検証

GA4には,「市区町村」と対応する「都市ID」なるものがあります.計測した上記のアクセスは都市IDが「1003629」からのもので,このIDが「Lanzhou」に対応することは,GA4の探索レポートやGA4と接続したLooker Studioなどでテーブルを作るなどして確かめられると思います.

ですが今回は,この都市ID「1003629」がどの都市を指すのかを,Googleで「GA4 都市ID 1003629」と通常検索して調べてみました.するとまともな検索結果が得られませんでした(図3参照).

図3.Googleでの「GA4 都市ID 1003629」検索結果.

図3.Googleでの「GA4 都市ID 1003629」検索結果.

 

それならとAIモードに切り替えると,「GA4 都市ID 1003629」に関して以下のような返答をしました(図4参照).

GA4(Googleアナリティクス4)やGoogle広告のジオターゲット(地域設定)で使用されるID「1003629」は、
日本の静岡県(Shizuoka)を指します。
Googleが提供する「地理的なターゲットのCSVデータ(Geotargets)」において、以下の通り定義されています。

    Criteria ID: 1003629
    Name: Shizuoka
    Type: Prefecture(都道府県)
    Country Code: JP(日本)

GA4の「都市」ディメンションではなく、「地域(Region)」ディメンションでこのIDが該当する場所を示しています。

 

図4.GoogleのAIモードでの「GA4 都市ID 1003629」の返答.

図4.GoogleのAIモードでの「GA4 都市ID 1003629」の返答.

 

明らかに違った返答をしています.

しかたないので,Geminiに「GA4の都市IDが「1003629」の都市はどこですか?」と聞いたところ,以下のようなちゃんとした情報が得られました(図5参照).

項目,内容
都市名,蘭州市(Lanzhou)
正式名称(Canonical Name),"Lanzhou,Gansu,China"
国コード,CN(中国)
ターゲットタイプ,City(都市)
親地域のID,20190(甘粛省 / Gansu)

 

図5.Geminiの返答.

図5.Geminiの返答.

 

3.計測データの異常性と悪質性

上記の「国:China」&「市区町村:Lanzhou(都市ID:1003629)」のアクセスが,正当なアクセスならいいのですが,データを見る限りそうではないことがわかりました.

該当するセッションで閲覧されたページやランディングページの多くが明らかに,通常では表示されることがあり得ないページ(URL)なのです.普通にちゃんとした記事ページを表示したとされるセッションもありますが,通常では表示されないページ(例えば図6のようなサイトの構造から直接URLを打てば表示できる画像だけを表示した状態になるページなど)が数多く表示されていました.そしてこれらのページの表示回数は,たいてい1~2回と計測されているのです.

図6.通常のアクセスでは表示されることがないページの例.

図6.通常のアクセスでは表示されることがないページの例.

 

このようなページビューが大量に計測されるので,このアクセスによって「ページとスクリーン」と「ランディングページ」の表示回数も跳ね上がってしまいます(図7と図8参照).

図7.該当するGA4のページとスクリーンのレポート.

図7.該当するGA4のページとスクリーンのレポート.

 

図8.該当するGA4のランディングページのレポート.

図8.該当するGA4のランディングページのレポート.

 

何かしらの自動ツールを使ったアクセス(攻撃)だと考えられますが,目的は不明です.いずれにせよ,計測データを無価値にするような悪質な行為です.

 

4.検討される対策案

同様なアクセスが他でも計測されているのか気になりましたが,もしあるならば上記のアクセスに対する現時点での解決策は,計測されたデータに対してフィルタを使って該当アクセスを除外するしかないと思います.

以下のような条件を組み合わせたフィルタの適用が現実的だと思われます.

  • 特定条件による除外:

言語:English + 国:China + 市区町村:Lanzhouの組み合わせをつかったフィルタで除外する.中国からの英語環境によるアクセスは,日本向けサイトでは通常考えにくいため,この組み合わせを使ったフィルタは有効だと考えます.

  • 言語によるフィルタリング:

サイトが日本語のみの場合,言語設定を「Japanese」のみに絞るフィルタが最も手軽だと考えます.ただし,翻訳ツール経由の正当な海外ユーザーを排除するリスクがあります.

  • 国・都市単位の除外:

「市区町村:Lanzhou(都市ID:1003629)」に該当するアクセスを除外するフィルタが使えます.ですが,攻撃元が場所を変えてくる可能性を考慮し,今後も続くようであれば「国:China」を丸ごと除外するのが運用面で最も効率的かとも考えます.

 

5.追記:GTMでの該当条件のアクセスを対象外にする方法(要注意)

この節では,どうしてもGA4のデータに上記の問題のアクセスを記録させたくないという人のためのGoogleタグマネージャー(以下,GTM)での設定方法を紹介します.ですが,この設定はリスキーな面も多いと感じます.したがって,お薦めしませんし,完全に自己責任でお願いします

以下では,2節で示したトラフィックの属性データから,国が「China」かつ言語が「English」に該当するアクセスをGA4の計測の対象外にするGTMの設定を紹介します.この方法は,Geminiに『国「China」かつ言語「English」のアクセスをGA4から除外する(GA4に記録させない)ためのGTMの設定は可能ですか』と質問して得られた回答を元に,一部アレンジしたものとなっています.

まず,国を判断するためのカスタムHTMLとして以下のコードをGeminiに生成してもらいました.

<script>
 (function() {
   // APIから位置情報を取得
     fetch('https://ipapi.co/json/')
     .then(function(response) {
     return response.json();
    })
    .then(function(data) {
    // 取得した国情報をdataLayerにプッシュ
      window.dataLayer = window.dataLayer || [];
      window.dataLayer.push({
         'event': 'location_ready', // 取得完了を知らせるイベント名
         'visitor_country': data.country_name, // 例: "China"
         'visitor_country_code': data.country_code // 例: "CN"
      });
    })
      .catch(function(error) {
      console.error('Location API error:', error);
       });
 })();
</script>

 

上記は,ipapi(https://ipapi.co/)というIPアドレスから国などの情報を教えてくれるサービスのAPIを使ったコードだとGeminiが解説をしてくれました.確かに「https://ipapi.co/」にアクセスすると,図9のように,自分のIPアドレス(IPv6の値)とそのアドレスの国の情報などが示されます.

図9.ipapiのサイト.

図9.ipapiのサイト.

 

なお,上記カスタムHTMLのコードの「’visitor_country_code’: data.country_code」の行はこれから紹介する方法では使わないので,削除してもかまわないと思います.

そしてGeminiの回答には,以下のような注意点やヒントなどもありました.

設定の注意点

  • APIの読み込み待ち: APIで国を判定する前にGA4タグが動いてしまうと、除外が間に合いません。確実に除外するには、GA4タグの発火タイミングを「APIの読み込み完了後(カスタムイベント)」に合わせる調整が必要です。
  • 精度の問題: VPNを経由しているアクセスや、APIのデータベースの精度により、100%完璧に除外できない場合があります。
  • コストとプライバシー: 外部APIを利用する場合、アクセス数によっては有料になることがあります。また、居住地域によってはプライバシーポリシーへの記載が必要になるケースもあります。

運用のヒント

  • APIの制限に注意: ipapi.co の無料版は1日1,000リクエストまでです。アクセス数が多いサイトの場合は、自前でデータベースを持つか、有料プラン、あるいはCloudflare Workersなどのエッジコンピューティングで国判定を行う方法がより堅牢です。
  • 動作確認: GTMのプレビューモードで、自分がアクセスした際に location_ready イベントが発生し、visitor_country に正しい国名が入っているか確認してください。

Geminiの運用のヒントの情報通りならば,1日のアクセスが1000より少ないサイトならこのコードが十分使えると思います.したがって,このコードを使うことにします.

GTMで「タグ > 新規」から「タグタイプを選択」を表示させ(図10参照),「カスタムHTML」を選び,上記のコードを追加し,トリガーを「Initialization – All Pages」で名前をつけて保存します(図11参照.本例ではこのタグを「国情報取得」と名付けています).

図10.タグタイプを選択の画面.

図10.タグタイプを選択の画面.

図11.カスタムHTMLのタグの設定.

図11.カスタムHTMLのタグの設定.

 

このカスタムHTMLで取得した国情報の値が入っている「visitor_country」を受け取るための変数をGTMで作ります.GTMで「変数 > ユーザー定義変数 > 新規」から「変数タイプを選択」を表示させ(図12参照),「データレイヤー変数」を選び,データレイヤーの変数名に「visitor_country」と入力し,名前をつけて保存します(図13参照.本例ではこのタグを「国情報取得」と名付けています).

図12.変数タイプを選択の画面.

図12.変数タイプを選択の画面.

図13.データレイヤーの変数「visitor_country」の設定.

図13.データレイヤーの変数「visitor_country」の設定.

 

次に,ブラウザの言語情報を取得する準備をします.Geminiの回答では,GTMの組み込み変数として「Language」があるから,それを使って設定するという回答だったのですが,GTMの組み込み変数として「Language」はないと思います.そこで,カスタムJavaScript変数を使って,ブラウザの言語情報を取得するように変更しました(なお,図9に示すようにipapiで取得できる情報に「Language」がありますが,この情報は取得したIPアドレスの国の主要言語の情報であり,アクセスしているユーザーのブラウザの言語情報ではないと思います).

GTMで「変数 > ユーザー定義変数 > 新規」から「変数タイプを選択」を表示させ,「カスタムJavaScript」を選び,下記のコード(このJavaScriptのコードは,Geminiに生成してもらいました)を貼り付けて,名前をつけて保存します(図14参照.本例ではこのタグを「ブラウザ言語設定取得」と名付けています).

function() {
  // ブラウザの言語設定を取得し、小文字に統一して返す
  // 例: "ja-JP" -> "ja-jp"
  return (navigator.language || navigator.userLanguage).toLowerCase();
}

 

図14.カスタムJavaScriptの設定.

図14.カスタムJavaScriptの設定.

 

本例では,GA4の計測用のタグ(Googleタグ)は,タグ「国情報取得」の読み込み完了後に動く必要があります.そのために,タグ「国情報取得」内の「’event’: ‘location_ready’」という記述で「location_ready’」というイベントを発生させ,このイベントをGA4の計測用のタグのトリガーとして使います.GTMで「トリガー > 新規」から「トリガーのタイプを選択」を表示して(図15参照),「カスタム イベント」を選び,イベント名に「location_ready」と入力し,トリガーの発生場所を「すべてのカスタム イベント」に選び,名前を付けて保存します(図16参照.本例ではこのタグを「location_ready」と名付けています).

図15.トリガーのタイプを選択の画面.

図15.トリガーのタイプを選択の画面.

図16.カスタムイベントのトリガーの設定.

図16.カスタムイベントのトリガーの設定.

 

次に『国が「China」であり,かつ,言語が「English」に該当する』という条件のトリガーを作成します.GTMで「トリガー > 新規」から「トリガーのタイプ」を選択を表示して(図15参照),「カスタム イベント」を選び,イベント名に「location_ready」と入力し,このトリガーの発生場所を「一部のカスタム イベント」に選び,条件として「{{visitor_country}}・等しい・China」,かつ,「{{ブラウザ言語設定取得}}・含む・en」として,名前を付けて保存します(図17参照.本例では「除外用location_ready(China_and_en)」と名付けています).

図17.除外用のカスタムイベントのトリガーの設定.

図17.除外用のカスタムイベントのトリガーの設定.

 

GTMでGA4の計測用のタグを開いて,トリガーの欄で配信トリガーを「location_ready」を選択し直して,例外として「除外用location_ready(China_and_en)」を追加して保存します(図18参照).

図18.Googleタグのトリガーを修正.

図18.Googleタグのトリガーを修正.

 

設定が終わったので,プレビューで確認します.location_ready以降に,変数の「visitor_country」や「ブラウザ言語設定取得」の値が,とれているかなどを確認しましょう.

問題が無ければ公開します.

上記の設定で『国が「China」に等しく,かつ,言語が「en」を含む』に該当するアクセスがGA4の計測対象外にできるので,この記事で問題としたアクセスはGA4の計測データに記録されなくなります.この方法を応用すれば,例えば『言語が「ja」を含まない』に該当するアクセスをGA4の計測対象外にもできるでしょう.

ですがこのようなある条件を計測対象外する設定は,予期せぬ影響が生じることがあるので注意が必要です.Geminiでも以下のような注意が回答内に含まれていました.

この設定の注意点

  • 取りこぼしの可能性: 日本在住でも、ブラウザの設定を英語(en)にしているユーザーのデータは記録されなくなります。
  • 過去のデータには適用されない: この設定をした瞬間からのデータにのみ適用されます。過去のデータから日本語以外を除外したい場合は、GA4のレポート画面やLooker Studioの「フィルタ」機能を使用してください。
  • 他のタグへの影響: 広告タグ(Google広告やMeta広告など)も同様に制御したい場合は、それらのタグのトリガーも同様に変更する必要があります。

もう一度書いておきますが,上記の『国が「China」に等しく,かつ,言語が「en」を含む』に該当するアクセスをGA4の計測対象外にする設定を参考にしていいですが,実装は自己責任でお願いします.問題が発生してもこちらでは責任はとれません.

当サイトでは2月9日以降,この記事で問題としたアクセスはなくなりました.本記事の第5節の追記で書いた設定は,この記事で問題とした流入に適用して試す機会はありませんでした.この設定が実際に有効に機能するかは,国が「Japan」かつ言語が「en」の流入に対して行いました(機能したことを確認しました).

 

6.追記2:対象外設定をした環境の計測結果

5節の追記でGTMの『国が「China」に等しく,かつ,言語が「en」を含む』に該当するアクセスをGA4の計測対象外にする設定をしたときは,問題とした中国・甘粛省(Gansu)・蘭州市(Lanzhou)からのアクセスの流入が無くなっていたのですが,2026年2月末頃からまた問題のアクセスが復活しました.

今回は,中国・甘粛省(Gansu)・蘭州市(Lanzhou)のアクセス他に,シンガポール(Singapore)からの同様のアクセスが増えました.

<Singaporeからのトラフィックに関係するGA4のデフォルトのディメンションの情報>

  • セッションのメインのチャネルグループ:Direct
  • セッションの参照元/メディア:(direct) / (none)
  • ユーザーの最初のメインのチャネルグループ:Direct
  • 言語:English
  • OSとバージョン:Windows 10
  • 国:Singapore
  • 地域:(not set)
  • 市区町村:Singapore

 

そこでGTMで,『国が「Singapore」であり,かつ,言語が「English」に該当する』という条件に該当するトリガーを作成して(図19参照.本例では「除外用location_ready(Singapore _and_en)」と名付けています),GA4の計測用のタグに例外として「除外用location_ready(Singapore _and_en)」を追加して保存します(図20参照).

図19.除外用のカスタムイベントのトリガーの設定.

図19.除外用のカスタムイベントのトリガーの設定.

 

図20.Googleタグのトリガーを再修正.

図20.Googleタグのトリガーを再修正.

 

この問題のアクセスに対する対策なしGA4と図20の設定をした対策ありGA4と計測結果を比べてみました.

 

セッションの参照元/メディア:(direct) / (none)&国:China&言語:Englishのセッション

2026年2月28日2026年3月1日2026年3月2日
対策なしGA4102144104
対策ありGA4455232

 

セッションの参照元/メディア:(direct) / (none)&国:Singapore&言語:Englishのセッション

2026年2月28日2026年3月1日2026年3月2日
対策なしGA4155279135
対策ありGA46310062

 

対策ありGA4の問題の該当するアクセスのセッション数は,対策なしGA4の場合よりも減っているのですが,該当するアクセスのすべては除外できていないようです. 該当するアクセスの一部しか除外(計測対象外)にできなかった理由は,国の判定をするためのカスタムHTMLで使用したipapi.co の無料版APIの制限に達した(Geminiの回答では1000件とされていましたが実際はそれより少ない?)とか,ipapi.co での国判定がうまく機能しない・反映が遅いために「error」と扱われ例外の条件とマッチしないとかなどが考えられます.

以上の結果から,5節で紹介した方法は今回のような問題のアクセスに対する対策は役に立たなそうだと言えます.中途半端に問題のアクセスを除外するならば,他の設定などにも影響があるかもしれないリスクをしてまで行う価値はないと感じます.

4節で書いたように計測されたデータから,該当するアクセスをフィルタで除外することが現状は最善の対策だと思われます.

補足:言語情報だけを使った別の対策方法として,記事「GA4異常アクセス対策:ブラウザの言語情報を活用して中国・シンガポールからのスパムを遮断する」を書きました.