2026年5月20日
2026年5月20日
WordPressのSEOスパム(日本語キーワードハック)を見つけて削除する方法
SEO スパム(SEO スパムハック)は、攻撃者が改ざんしたサイトに偽の商品ページやリンクを大量に作らせ、自分の通販サイトなどへの検索流入を増やす手口です。日本語の商品名を並べたページが作られるものは、Google の解説でも「日本語キーワードハック」(Japanese keyword hack)と呼ばれています。
この記事の手順は、Google が web.dev で公開している「Fix the Japanese keyword hack」と、WP-CLI の公式ドキュメントを2026年11月時点で確認してまとめたものです。
どんな状態になるか
site:example.comで検索すると、作った覚えのない URL(ランダムな英数字のディレクトリ名など)が並び、日本語の商品名や「激安」などの説明文が表示される- Search Console の「セキュリティの問題」に、ハッキングされたコンテンツが報告される
- Search Console のユーザーに、知らない所有者が追加されている
- 自分がブラウザで開くと普通のページや 404 が表示されるのに、Google にだけスパムを見せている(クローキング)
最後のクローキングのため、ブラウザで見て問題が無くても安心はできません。Search Console の「URL 検査」で、Googlebot が受け取った内容を確認します。
作業の前に
- バックアップを取る。 ファイルとデータベースをサーバーの外に保存します。調査の材料になり、作業を誤ったときにも戻せます。
- 管理者のパスワードを変えるのは、侵入口を塞いでから。 先に変えても、残ったバックドアから再び侵入されることがあります。ただし、ホスティングの管理画面・FTP・データベースのパスワードは、別の端末から早めに変えてください。
以下のコマンドは、WordPress が /var/www/html にあり、SSH で WP-CLI が使える前提です。共用レンタルサーバーで SSH が使えない場合は、ファイルマネージャーや FTP で同じ場所を確認します。
1. 感染の範囲を確かめる
Search Console を確認する
- 「セキュリティと手動による対策」→「セキュリティの問題」で、Google が検出したページの例を確認します。
- 「設定」→「ユーザーと権限」で、知らない所有者やユーザーがいれば削除します。所有権の確認に使われた HTML ファイル(
googleで始まる.html)や、.htaccessの確認用の書き換えルールも削除します。削除しないと、再び所有者として追加されます。 - 「URL 検査」でスパムの URL を調べ、「クロール済みのページを表示」で Google が見た内容を確認します。
最近変更されたファイルを探す
改ざんされたファイルは、更新日時から絞り込めることがあります。
# 過去30日以内に変更された PHP ファイル(新しい順)
find /var/www/html -type f -name '*.php' -mtime -30 -printf '%TY-%Tm-%Td %TH:%TM %p\n' | sort -r | head -50
# アップロード用のディレクトリにある PHP ファイル(通常は不要なもの)
find /var/www/html/wp-content/uploads -type f \( -name '*.php' -o -name '*.phtml' -o -name '*.phar' \)
# すべての .htaccess(隠れた場所に作られることがある)
find /var/www/html -name '.htaccess' -printf '%TY-%Tm-%Td %p\n'
更新日時は書き換えられることがあるので、この結果だけで判断せず、次の検査と組み合わせます。
難読化されたコードを探す
Google の解説では、base64_decode、rot13、eval、strrev、gzinflate などを使って中身を読めなくしたコードが手がかりとして挙げられています。正規のプラグインでも使われる関数なので、見つかったファイルは中身を読んで判断します。
grep -rlE 'eval\(|base64_decode\(|gzinflate\(|str_rot13\(|strrev\(' /var/www/html/wp-content --include='*.php' | head -50
index.php・wp-load.php・テーマの 404.php などに不審なコードが足されることがあります。
WordPress のファイルが改ざんされていないか確認する
WP-CLI で、コアと WordPress.org 配布のプラグインのファイルを公式のチェックサムと照合します。
cd /var/www/html
wp core verify-checksums
wp plugin verify-checksums --all
一致しないファイルや、本来存在しないファイルが報告されます。WordPress.org 以外から入れた有料プラグインやテーマは照合できないので、配布元から入れ直します。
データベースを確認する
スパムが投稿として作られたり、ウィジェットや設定にリンクが埋め込まれたりすることもあります。
# 管理者の一覧(知らないアカウントがないか)
wp user list --role=administrator --fields=ID,user_login,user_email,user_registered
# 最近作られた投稿・固定ページなど
wp post list --post_type=any --post_status=any --orderby=date --order=DESC --posts_per_page=30 --fields=ID,post_type,post_status,post_date,post_title
# サイトの URL が書き換えられていないか
wp option get siteurl
wp option get home
# データベース全体からスパムの文字列を探す(例: 見つかった URL のドメイン)
wp db search 'spam-domain.example' --all-tables
# 不審な予約イベント
wp cron event list
wp db search には、site: 検索で見つかった URL のドメインや商品名など、実際のスパムに含まれる文字列を指定します。
wp-content/mu-plugins/ は管理画面のプラグイン一覧で目立たないため、攻撃者がファイルを置く場所として使われることがあります。置いた覚えのないファイルが無いかも確認してください。
2. スパムと不正なファイルを取り除く
.htaccess を元に戻す
Google の解説は、.htaccess を「クリーンな、または既定の内容に置き換える」ことを勧めています。WordPress の標準の内容は次のとおりです(サブディレクトリに置いている場合はパスが変わります)。
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
自分で追加したリダイレクトや IP 制限がある場合は、その部分だけを中身を確かめて書き戻します。wp-content 以下など、自分で作った覚えのない場所の .htaccess は、内容を保存したうえで削除します。
なお、wp rewrite flush --hard は # BEGIN WordPress から # END WordPress の間を書き直すだけで、その外側に書き足された不正なルールは消えません。
コアとプラグイン・テーマを入れ直す
コアのファイルは、今と同じバージョンで上書きします。--locale はサイトの言語に合わせます(日本語版なら ja)。--skip-content を付けると、wp-content 内の既定のテーマやプラグインは上書きしません。wp-config.php と wp-content は上書きされません。
wp core download --version=$(wp core version) --locale=ja --skip-content --force
プラグインとテーマも、配布元の新しいファイルで入れ直します。WordPress.org のものは次のコマンドで上書きできます。
wp plugin install プラグインのスラッグ --force
wp theme install テーマのスラッグ --force
使っていないプラグインとテーマは削除します。テーマを自分で編集している場合は、入れ直すと変更が消えるので、バックアップと比べてから戻します。
不正なファイルとデータを削除する
- アップロード用ディレクトリの PHP ファイルは、中身を確認してから削除します。
- 調査で見つかった、コアにもプラグインにも属さない不審なファイルを削除します。
- 知らない管理者アカウントを削除します(
wp user delete ID --reassign=自分のユーザーID)。 - スパムの投稿は、ID を確認してから削除します。文字列が一致した投稿を一括で削除すると、正規の記事まで消すおそれがあります。
wp post delete 1234 1235 --force
パスワードと秘密鍵を変える
侵入口を塞いだら、すべての管理者のパスワードと、wp-config.php の認証用キー(ソルト)を変えます。キーを変えると、ログイン中のすべてのセッションが無効になります。
wp user update 自分のユーザーID --user_pass='長いランダムなパスワード'
wp config shuffle-salts
データベースのパスワードを変えた場合は、wp-config.php の DB_PASSWORD も合わせて変えます。
3. 掃除できたかを確かめる
site:検索で見つかったスパムの URL を開き、404 または 410 が返ることを確認します。- Search Console の「URL 検査」で同じ URL を調べ、Google にもスパムが見えなくなっていることを確認します。
- サイトマップに見覚えのない URL や、自分で作っていないサイトマップファイルが無いかを確認します。Search Console の「サイトマップ」で、正規のサイトマップを送信し直します。
Google のサイトマップ ping(google.com/ping?sitemap=)は2023年に廃止されたため、送信は Search Console か robots.txt の Sitemap: 行で行います。
4. Google に知らせる
- 「セキュリティの問題」で報告されていた場合は、すべて解決してから「審査をリクエスト」を送ります。解決していない状態で送ると、審査が通りません。
- スパムの URL が検索結果から消えるまでには時間がかかります。目立つ URL を早く消したい場合は、Search Console の「削除」ツールで一時的に非表示にできます。ただし一時的な措置なので、ページ自体が 404 か 410 を返す状態にしておく必要があります。
再発を防ぐ
Google の解説によると、ハッキングされたサイトの約20%は1日以内に再びハッキングされます。侵入口が残っていると、掃除してもすぐに元に戻ります。
- WordPress・プラグイン・テーマを更新し、更新が止まったプラグインは別のものに置き換える
- 管理者アカウントを必要な人だけにし、2段階認証を使う
- アップロード用ディレクトリで PHP を実行できないようにする
- 管理に使うパソコンのウイルス検査をする
- 定期的にバックアップを取り、改ざんに気づけるよう Search Console の通知メールを受け取る
バックドアの探し方は「WordPressのバックドアを検出・削除する方法」、感染からの復旧全体の流れは「WordPressのマルウェア感染を駆除・復旧する方法」で説明しています。