WordPress のセキュリティ対策で、最後まで閉じられない入口が問い合わせフォームです。更新もログイン強化も終わったあと、毎日「知らない人が書いたデータ」が入ってくる場所はフォームしか残りません。
この記事は、WordPress サイトを自社運用している Web 担当者と、顧客サイトを保守する制作会社向けです。一般的な総論は前半で短く済ませ、残りはフォームという入口の点検に使います。フォームスパムを手軽な順に潰す 5 段階の手順は別記事に分けてあり(後述の表からリンク)、ここは全体像の中でのフォームの位置づけに絞ります。
基本の手当ては先に済ませる。ただしここで長居しない
更新・入手先・権限・ログインの 4 つは、一度公式の推奨どおりに整えれば、あとは月 1 回の点検で足ります。フォームを運用している側から見ると、この 4 つは「届いた問い合わせを誰が読めるか」に直結する項目でもあります。
- 更新:本体は、既存サイトはマイナー更新が既定で自動、5.6 以降の新規サイトはメジャー更新も既定で自動です。一方でプラグインとテーマの自動更新は「重大な脆弱性の修正など WordPress.org 側が判断した特別な場合」に限られます(公式)。フォームプラグインもここに含まれるので、放っておいて上がるとは限りません。5.5 以降はプラグイン一覧から個別に自動更新を有効にできます(公式)。更新前のバックアップも公式が注意しています。
- 入手先:プラグインとテーマは公式ディレクトリか、素性の分かる提供元に限る(公式)。フォーム関連は入力値が最初に通るコードなので、ここは妥協しない。
- 権限:管理者(Administrator)を配りすぎない。サイトの内容を書き出す
export、ユーザー一覧を開くlist_usersは既定で管理者以上のみです(公式)。問い合わせを DB に保存する構成なら、管理者の人数がそのまま「過去の問い合わせを読める人数」になります。 - ログイン:
adminやwebmasterのような推測しやすいユーザー名を避け、強いパスワードと 2 段階認証を使う(同じハードニング文書の推奨)。
ここまでで「勝手に入られる」経路はおおむね塞がります。残るのは、塞いではいけない入口です。
閉じられない入口はフォームだけです
管理画面はログインで閉じられますが、フォームは「誰でも入力して送信できる状態」を保つのが仕事なので、構造的に閉じられません。
Hajik が分析した、美容商社(国内最大手・上場)の実フォームデータでは、3 種類のフォーム合計 1,894 件・約 20 か月分のうち、汎用フォームの 56.2%、中途採用フォームの 73.1% が営業目的の送信でした。問い合わせフォームでも営業(確度高)が 12.9% です。しかもこれは すべて reCAPTCHA v3 を通過した送信 で、明らかなボットは事実上ゼロです。
つまり、フォームから入ってくるものの主役は「攻撃」ではなく、人間が書いた営業です。ログイン強化もセキュリティプラグインも、ここには 1 件も効きません。仕分けの実務は問い合わせフォームの営業メール対策にまとめています。
なおこの分類は文面の特徴から簡易的なヒューリスティックで振り分けた結果で、比率は業種・規模・フォームの性格によって大きく変わります。あくまで一社・一時点のサンプルとして読んでください。
フォーム固有の攻撃面を 5 つに分けて点検する
フォームまわりで点検すべきは「送信」「中身」「添付」「保存」「通知」の 5 か所です。
| 点検する場所 | 起きること | 手当て |
|---|---|---|
| 自動送信 | 同一の送信元から短時間に連続送信、深夜の定型文の連投 | レートリミット、ハニーポット、reCAPTCHA。5 段階の手順 |
| 入力値の中身 | 本文に混ぜられた HTML やスクリプトが、管理画面や通知メールで解釈される | 表示側でエスケープする。管理画面で本文を HTML として描画する設定は避ける |
| 添付ファイル | 受け取ったファイルが公開ディレクトリに置かれ、URL を知る人が取得できる | 初回の問い合わせで添付を受け取らない。必要なら保存先と公開範囲を確認する |
| 保存場所 | 送信内容がサイトの DB に平文で溜まり続ける | 保存する/しないを意識して選ぶ(次章) |
| 通知メールの経路 | サイトのサーバーから送るため、迷惑メール判定や設定ミスで静かに消える | SPF・DKIM・DMARC を整える |
補足すると、WordPress 本体のアップロード判定では .swf と .exe は常に除外され、.htm .html .js は unfiltered_html 権限を持たない利用者に対して除外されます(公式)。ただしフォームプラグインが本体の判定を通すかは実装次第なので、添付を受け取るなら仕様を確認してください。
実際に事故になりやすいのは保存場所と通知メールです。攻撃で壊れるのではなく、気づかないうちに進行する からです。
送信内容は、思っているより多くの場所に写しがある
フォームの送信内容は、通知メール・サイトの DB・外部サービスの 3 か所に分かれて増えていきます。
Contact Form 7 は既定では利用者の個人データを DB に書き込まない、と公式に明記されています。一方、reCAPTCHA や Akismet を有効にすると送信者の IP アドレスを含む個人データが提供元へ送られることがある、とも書かれています(公式)。保存用の Flamingo を入れると、送信データはサーバー上の DB に保存され、管理画面から検索できるようになります(公式)。
どれも不当な挙動ではありません。問題は、どれを選んだのか把握しないまま数年運用していること です。DB に保存する構成を選んだ瞬間、WordPress の管理者アカウントは「過去数年分の問い合わせを読み書きできる鍵」になります。制作会社・退職した担当者・一時的な外注に配った管理者権限が残っていれば、その人数分だけ鍵があります。
今日できる点検は 3 つです。管理者が何人いるか数える、用途のない人を降格または削除する、保存プラグインを使っているなら保管期間と削除の担当を決める。保管や委託先の実務は問い合わせフォームの個人情報の扱い方に分けて書いています。
プラグインを増やすほど、攻撃面と保守の宿題が増える
プラグインは 1 つ増えるたびに、コードの量・更新の宿題・データの送り先が増えます。
前述のとおり、プラグインの自動更新は既定ではかかりません。追加した数だけ、誰かが更新を見続ける必要があります。また、公式のアンインストール手順も「停止(Deactivate)→削除(Delete)」の 2 手順で、削除まで進めて初めてファイルが消えます。wp-content/mu-plugins に置かれた must-use プラグインは一覧に表示されず、管理画面から停止できません(いずれも公式)。保守を引き継いだサイトで「何が動いているか分からない」となる典型がここです。
追加の前に 4 つ自問すると、半分は入れずに済みます。
- その機能は本当に必要か(月に一度も使わない管理画面ではないか)
- 提供元の素性は分かるか、更新は続いているか
- 送信内容をどこへ送るか(外部 API を使うなら、それは委託になる)
- 誰が更新を見るか、その人が辞めたらどうなるか
私たちが Hajik をプラグインではなく script タグ 1 行で動く形にしたのも、この宿題を顧客側に増やしたくなかったからです。自社サイトと複数の実サイトで運用していますが、フォームまわりの障害は増やしたプラグイン同士の相性から起きることが多い、というのが実感です。
設定を厳しくするほど、本物の問い合わせが静かに消える
ログインを締めすぎても困るのは社内の人だけですが、フォームを締めすぎると困るのは顧客で、しかも消えたことに気づけません。
実データでは、本物の問い合わせは短いものが多く、「この商品の在庫はありますか」程度の一行が普通にあります。逆に営業は丁寧で長い文面です。短い・英語が混ざる・海外からのアクセス、といった条件で機械的に弾くと、営業より先に本物が落ちます。必須項目を増やす、電話番号を必須にする、といった対策も、営業と本物を同じだけ減らします。
現実的な線は、遮断ではなくラベル付けを既定にして、迷ったら本物扱いにする ことです。人が最後に見る前提なら、判定が外れても取り返しがつきます。あわせて月 1 回、自分のスマートフォンからフォームを送信し、通知メールが担当者に届くところまで確認してください。届かなくなっていたと半年後に気づくのが、最も損の大きい事故です。
よくある質問
セキュリティプラグインを入れれば、フォームの営業メールも減りますか
減りません。守備範囲が違います。セキュリティプラグインが見るのは不正ログインや改ざんで、フォームに届く営業は「正規の手順で送られた、人間が書いた文章」です。実データでは reCAPTCHA v3 を通過した後にも営業が 12.9〜73.1% 残っていました。
フォームを閉じて、メールアドレスだけ載せるのは有効ですか
営業は減らず、本物の問い合わせだけが減ることが多い選択です。公開したアドレスも収集対象になり、問い合わせのハードルだけが上がります。入口を閉じるより、届いた後の仕分けを設計するほうが費用対効果は高くなります。
添付ファイルは受け取らないほうがいいですか
初回の問い合わせでは受け取らない設計をおすすめします。受け取ると、保存先・公開範囲・保管期間・ウイルス確認の 4 つを自社で管理することになるためです。必要なら、返信後にファイル共有サービスへ誘導するほうが楽です。
送信内容を AI に判定させるのは、セキュリティ上どうなのですか
保管と判定は別のレイヤなので、分けて見る必要があります。Hajik の場合、保管はブラウザ内で暗号化してから行うため、保管されたデータは私たちも復号できません。ただし判定の瞬間だけは、精度のために内容をそのまま AI に渡します(マスクすると本物の申込が誤判定されるため)。その際、クレジットカード番号・マイナンバー・銀行口座・パスポート番号・健康情報の 5 種はブラウザ内で除去してから送ります。詳細はセキュリティの考え方に記載しています。
まとめ:明日やること
- プラグイン一覧を開き、使っているものの自動更新を有効にする。使っていないものは停止ではなく削除する
- ユーザー一覧で管理者の人数を数え、用途のない管理者を降格または削除する
- 自分のスマートフォンからフォームを送り、通知メールが担当者に届くまでを確認する
- 送信内容が DB に保存される構成かどうかを確認し、保存しているなら保管期間の担当を決める
- 直近 1 か月に届いた問い合わせを並べ、何割が営業だったか数える
5 番の数字が想像より大きければ、それは WordPress のセキュリティではなく仕分けの問題です。Hajik は script タグ 1 行で、届いた内容を送信の瞬間に判定し、営業らしいものにラベルを付けます。99%+ の遮断、残り約 1% は人が判断する前提です。
無料診断で自社フォームの状況を確認するか、14 日間の無料トライアルで実際の判定結果をご覧ください。