WordPress改ざん検知を自動化する方法|title・h1・noindexの変化を監視で捕まえる
改ざんされたWordPressは「落ちない」から気づけない
WordPressの改ざん検知が難しいのは、改ざんされたサイトがダウンしないことにあります。攻撃者にとってサイトが落ちるのは都合が悪く、ページはHTTP 200を返し続けたまま、<title> が薬品の広告に書き換わり、<head> に外部スクリプトが差し込まれ、あるいは <meta name="robots" content="noindex"> が仕込まれて検索結果から静かに消えていきます。
死活監視(HTTP監視)は「応答があるか」を見る仕組みなので、この種の改ざんは原理的に検知できません。制作会社が顧客から「Googleで検索したら変なタイトルが出る」と連絡を受けて初めて発覚する、というのが典型的な流れです。
改ざんの検知には、応答の有無ではなくページの中身が想定どおりかを機械的に確認し続ける監視が必要です。この記事では、Miterl の DOM改ざん検知とキーワード監視を組み合わせて、制作会社が管理する複数のWordPressサイトを一括で見張る手順を解説します。
DOM改ざん検知で見張る7つのポイント
DOM改ざん検知(type: dom_integrity)は、ページを取得してHTMLを解析し、以下の項目を確認します。いずれか1つでも条件を満たさなければ Down と判定し、通常のダウン検知と同じ経路でアラートが飛びます。
| チェック項目 | 設定キー | Down になる条件 |
|---|---|---|
| title の存在 | dom_check_title |
<title> が無い、または空 |
| h1 の存在 | dom_check_h1 |
<h1> が1つも無い |
| noindex の混入 | dom_check_noindex |
<meta name="robots"> に noindex が含まれる |
| canonical の存在 | dom_check_canonical |
<link rel="canonical"> が無い、または href が空 |
| og:image の存在 | dom_check_og_image |
og:image メタタグが無い、または空 |
| og:title の存在 | dom_check_og_title |
og:title メタタグが無い、または空 |
| title の必須文言 | dom_title_must_contain |
<title> に指定文字列が含まれない |
改ざんの検知という観点で特に効くのは、dom_title_must_contain と dom_check_noindex の2つです。
dom_title_must_containに「会社名」や「サービス名」を入れておけば、title がまるごと書き換えられた瞬間に Down になります。SEOスパム型の改ざんは title の差し替えを伴うことがほとんどですdom_check_noindexは、攻撃者による差し込みだけでなく、ステージングの noindex を本番に持ち込んだまま公開したという制作現場でありがちな事故も同じ仕組みで捕まえます
なお、DOM改ざん検知はページ全体のハッシュを比較する方式ではありません。「本文の一文字が変わった」までは追わず、SEOと表示に直結する構造要素に絞って見る設計です。本文レベルの文言を見張りたい場合は、次に説明するキーワード監視を併用します。
検知範囲を絞る理由
ページ全体のハッシュ比較は、WordPressのように動的な要素(最新記事一覧・日付・nonce付きのスクリプトタグ)を含むサイトでは更新のたびに反応してしまい、実運用ではアラートを無視する習慣がついて終わります。改ざん検知で本当に必要なのは「攻撃者が必ず触る場所」と「壊れると被害が大きい場所」に集中することです。
キーワード監視で「消えてはいけない文言」を見張る
キーワード監視(type: keyword)は、ページ本文に特定の文字列が含まれているか、または含まれていないかを確認します。
keyword_exists: true— 指定文字列が含まれていれば UP。フッターの会社名や特定商取引法の表記など「消えてはいけない文言」の監視に使いますkeyword_exists: false— 指定文字列が含まれていなければ UP。Warning:やFatal errorのようなPHPエラー表示、あるいは改ざんで差し込まれがちな文言の検知に使います
DOM改ざん検知が「構造」を見るのに対し、キーワード監視は「文言」を見ます。1サイトにつき両方を1本ずつ設定しておくと、SEOスパム型・エラー表示型の双方をカバーできます。
APIで一括登録する
制作会社が数十サイトを管理している場合、ダッシュボードから1つずつ作るより API で一括登録する方が確実です。DOM改ざん検知は Pro プラン、キーワード監視は Standard 以上のプランで利用できます。
DOM改ざん検知の作成
# DOM改ざん検知(type: dom_integrity)— 5分おきに title / h1 / noindex / 必須文言を確認
curl -X POST https://miterl.com/api/v1/monitors \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "client-a.example.com DOM",
"type": "dom_integrity",
"url": "https://client-a.example.com/",
"interval_seconds": 300,
"dom_check_title": true,
"dom_check_h1": true,
"dom_check_noindex": true,
"dom_check_canonical": true,
"dom_title_must_contain": "株式会社クライアントA"
}'
キーワード監視の作成
# キーワード監視(type: keyword)— PHP の Fatal error 表示が出たら Down
curl -X POST https://miterl.com/api/v1/monitors \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "client-a.example.com fatal error",
"type": "keyword",
"url": "https://client-a.example.com/",
"interval_seconds": 300,
"keyword": "Fatal error",
"keyword_exists": false
}'
複数サイトに同じ設定を配る場合は、サイト一覧を CSV にしてループで叩くのが最短です。
# sites.csv: name,url,must_contain
while IFS=, read -r name url must; do
curl -s -X POST https://miterl.com/api/v1/monitors \
-H "Authorization: Bearer $MITERL_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"name\":\"$name DOM\",\"type\":\"dom_integrity\",\"url\":\"$url\",\"interval_seconds\":300,\"dom_check_title\":true,\"dom_check_noindex\":true,\"dom_title_must_contain\":\"$must\"}"
done < sites.csv
テーマ更新・リニューアル時の誤検知を防ぐ
改ざん検知は「想定と違う」を検知する仕組みなので、意図した変更にも反応します。テーマ更新で h1 の構造が変わった、リニューアルで title の表記を変えた、という場面で鳴らないようにするには、作業の前後を監視側に伝えます。
- メンテナンスウィンドウを作業時間に合わせて設定する。デプロイスクリプトから Webhook(
POST /api/v1/webhooks/maintenance/{token}/startと/end)を叩けば、作業開始と終了に合わせて自動で開始・終了できます - リニューアルで title の表記が変わる場合は、公開と同時に
dom_title_must_containを更新する(PUT /api/v1/monitors/{id}) - 短時間の過渡的なエラー(ビルド反映待ちなど)が繰り返し拾われる場合は、失敗しきい値(
failure_threshold)を上げるか、アラート抑止ルールで通知だけを止める
誤検知の抑え方は「監視の誤検知を減らす方法」で、デプロイ時の実体験を含めて詳しく解説しています。
検知したあとの動き方
改ざんが検知されたとき、制作会社がやるべきことは決まっています。順番を保守契約の手順書に落としておくと、担当者が誰でも同じ対応ができます。
- 公開ステータスページで状況を共有する — DOM改ざん検知の違反内容はステータスページにも表示できるため、顧客への一次連絡を電話やメールより早く済ませられます
- 該当ページのソースを保全する —
curl -s https://client-a.example.com/ > evidence.htmlで取得したHTMLを保存し、改ざん箇所を特定します - WordPress本体・テーマ・プラグインの改変を確認する —
wp core verify-checksumsとwp plugin verify-checksums --allでコアとプラグインの改変を確認します - バックアップからの復旧と原因の封じ込め — 改変ファイルの差し替えだけでは再発するため、侵入経路(脆弱なプラグイン・弱いパスワード)を潰してから復旧します
障害報告書の書き方は「障害報告書テンプレート」にまとめています。改ざんは通常のダウンと違って「いつから」が曖昧になりやすいので、監視の検知時刻を起点に書くと顧客に説明しやすくなります。
公開前チェックと組み合わせる
改ざん検知の設定を公開前に済ませておけば、noindex の残りや canonical の抜けといった公開直後の事故も同じ監視で捕まえられます。公開前に確認すべき項目は「Webサイト公開前の監視設定チェックリスト」に、保守契約への組み込み方は「WordPress保守サービスに死活監視を組み込む方法」にまとめています。SSL証明書の期限切れも同じ「落ちていないのに壊れている」類の事故なので、「WordPress制作会社向けSSL証明書期限の一括管理」もあわせて確認してください。
まとめ
- WordPressの改ざんはHTTP 200のまま進むため、死活監視だけでは検知できない
- DOM改ざん検知は title / h1 / noindex / canonical / OGP / 必須文言の7項目を確認し、攻撃者が必ず触る場所に絞って見張る
- キーワード監視を併用すると「消えてはいけない文言」と「出てはいけないエラー表示」の両方をカバーできる
- テーマ更新やリニューアルはメンテナンスウィンドウの Webhook で監視側に伝え、誤検知を防ぐ
- 検知後の手順(ステータスページ共有・ソース保全・checksums確認・復旧)を保守契約の手順書に落としておく
監視タイプの詳細な仕様はドキュメントを、料金プランごとの利用可能タイプは料金ページを参照してください。キーワード監視は Standard プランの14日間トライアルで試せます。登録して、まずは管理サイトのうち1つで「消えてはいけない文言」の監視から始めることをおすすめします。