Skip to content

Repository files navigation

WP Security Guard

WordPressサイト向けの統合セキュリティプラグインです。外部からの不正アクセス対策として、XML-RPC遮断・ユーザー名列挙対策・バージョン情報隠蔽・アプリケーションパスワード無効化・Contact Form 7スパム対策を1つのプラグインで管理できます。

  • バージョン: 2.9.0
  • 必須環境: WordPress 5.6以降 / PHP 7.4以降
  • ライセンス: GPL v2 or later

目次

  1. 開発経緯
  2. 導入背景
  3. 機能一覧
  4. インストール手順
  5. 導入時の重要作業
  6. 各機能の詳細と設定
  7. サイト点検モジュール
  8. 互換性・影響範囲
  9. 動作確認方法
  10. トラブルシューティング
  11. 変更履歴

開発経緯

従来の運用と課題

本プラグイン導入前、WordPressサイトのセキュリティ対策は以下のように分散管理されていました。

対策 実装方法 課題
ログイン試行回数制限 Limit Login Attempts Reloaded プラグイン (継続使用)
XML-RPC遮断 .htaccess<Files "xmlrpc.php"> Deny from all </Files> を記述 サーバー設定ファイルの編集が必要
CF7海外スパム対策 独自プラグイン spam-guard-cf7 機能が日本語チェックのみに限定

この運用では、プラグイン2つ + .htaccess を別々に管理する必要があり、サイト数が増えるほど管理コストが増大していました。また、各サイトで設定漏れや記述ミスが起こる懸念もありました。

本プラグインでの統合

本プラグイン WP Security Guard は、上記の運用を1プラグイン内の管理画面に統合することを目的として開発されました。

1. 既存機能の継承

従来の spam-guard-cf7 プラグインが持っていた以下の機能は、本プラグインにそのまま引き継がれています。設定値もそのままのIDで動作するため、移行は無停止で可能です。

  • お問合せ本文フィールドID(デフォルト your-message / 変更可)
  • 差出人名チェックのON/OFF切り替え
  • 差出人名フィールドID(デフォルト your-name / 変更可)
  • 日本語必須チェック(ひらがな/カタカナ/漢字のいずれも含まれない場合ブロック)
  • 同一のエラーメッセージ「英語でのお問い合わせには対応しておりません」

2. .htaccess のXML-RPC遮断記述のプラグイン化

従来 .htaccess で行っていたXML-RPC遮断をPHP側で実装。WordPressの XMLRPC_REQUEST 定数を検知し、.htaccess と同等の403レスポンスを返します。Apache/Nginx問わず動作し、.htaccess の管理が不要になります。

3. 追加されたセキュリティ機能

単なる統合にとどまらず、外部からの不正アクセス対策として以下を新規追加しました。

  • REST APIユーザー情報の保護(/wp-json/wp/v2/users)
  • ?author=N クエリによるユーザー名露出の遮断
  • ログインエラーメッセージの統一
  • WordPressバージョン情報の隠蔽(meta generator / RSS / CSS・JSクエリ)
  • アプリケーションパスワードの無効化
  • CF7スパム対策の強化(最小日本語文字数チェック / URL数上限チェック)

旧プラグインとの対応表

移行時の参考として、旧プラグインの設定が本プラグインのどの項目に対応するかを示します。

spam-guard-cf7 の設定項目 本プラグインの設定項目 備考
お問合せ本文のフィールドID 5. Contact Form 7スパム対策 → お問合せ本文のフィールドID 同じデフォルト値(your-message)
差出人名もチェックする 5. Contact Form 7スパム対策 → 差出人名もチェックする 同じ動作
差出人名フィールドID 5. Contact Form 7スパム対策 → 差出人名フィールドID 同じデフォルト値(your-name)

導入背景

本プラグインは、WordPressサイトに対する典型的な攻撃パターンから以下のように防御することを目的としています。

攻撃経路 対応機能
xmlrpc.php を狙ったブルートフォース・DDoS XML-RPC遮断
REST API からのユーザー名取得 REST APIユーザー情報保護
?author=N からのユーザー名列挙 authorクエリ遮断
ログインエラーメッセージからのユーザー名特定 ログインエラー統一
バージョン固有脆弱性の悪用 バージョン情報隠蔽
アプリケーションパスワード経由のREST API攻撃 アプリケーションパスワード無効化
Contact Form 7への海外スパム送信 日本語チェック / URL数制限 / 最小文字数

これらの対策を個別プラグインや .htaccess で管理する従来運用を一元化し、管理画面1つで全制御できるようにしています。


機能一覧

1. XML-RPC遮断

  • xmlrpc.php への直接アクセスを 403 Forbidden で拒否
  • X-Pingback HTTPヘッダーの削除
  • pingback.ping メソッドの無効化
  • .htaccess での遮断記述と同等の効果

2. ユーザー名列挙対策

  • REST APIユーザー情報保護: /wp-json/wp/v2/users への未認証アクセスを遮断
  • ?author=N 遮断: example.com/?author=1 でユーザー名URLに露出するのを防止
  • ログインエラー統一: 「ユーザー名が違います」「パスワードが違います」を「ユーザー名またはパスワードが正しくありません」に統一

3. WordPressバージョン情報の隠蔽

  • <meta name="generator"> の削除
  • RSSフィードのgeneratorタグを空に
  • CSS/JSファイルの ?ver=X.X.X クエリ文字列を削除

4. アプリケーションパスワード無効化

  • WordPress 5.6以降の「アプリケーションパスワード」機能を無効化
  • REST API経由のブルートフォース攻撃経路を遮断

5. Contact Form 7スパム対策

  • 日本語必須チェック: 本文に日本語(ひらがな/カタカナ/漢字)が1文字も含まれない投稿をブロック
  • 最小日本語文字数: 指定した文字数未満の日本語本文をブロック(デフォルト5文字)
  • URL数上限: 本文中のURL数が指定数を超える場合ブロック(デフォルト3個)
  • 差出人名チェック(オプション): 差出人名フィールドにも日本語必須チェックを適用

6. 会員登録スパム対策

  • 対象: WordPress標準(wp-login.php?action=register)と WooCommerce のマイアカウント登録フォームの両方
  • JSトークン検証(推奨・最重要): JavaScriptを実行しないスクリプト型ボットをほぼ完全に遮断
  • ハニーポット: 画面外の隠し入力欄が埋められた登録を拒否
  • 時間トラップ: フォーム表示から最小秒数未満の送信を拒否(署名付き・改ざん不可)
  • ユーザー名の内容検証: URL・不正TLDドメイン・スパム定型句・40字超のユーザー名/お名前を拒否
  • IPレート制限: 1IPあたりの1時間登録数を制限(IPはハッシュ化して保存)
  • wp-login.php 登録の遮断: 直接POSTをトップへリダイレクト(users_can_register の設定値に依存しない)
  • メール抑制(オプション・既定OFF): 登録者宛/管理者宛の登録メールを停止可能

すべての機能は管理画面から個別にON/OFFできます。

付属ツール: Flamingo データ一括削除

「セキュリティガード → Flamingo削除」の独立ページ(設定トグルではなくメンテナンス用ツール)。

  • Flamingo の受信メッセージ(flamingo_inbound)アドレス帳(flamingo_contact)を個別選択で完全削除(ゴミ箱を経由しない)
  • 期間指定:全期間/指定日以前/N日より古い(post_date 基準)。全ステータス(trash/spam含む)対象
  • Ajaxバッチ処理(250件/回)=進捗表示・中断可・再実行で続きから。実行前プレビュー+確認ダイアログ、実行ログ20件
  • ⚠️ アドレス帳の日付は「連絡先の作成日」基準(最終問い合わせ日ではない)

インストール手順

1. プラグインのアップロード

以下のいずれかの方法で wp-security-guard.php をインストールしてください。

方法A: FTP/SFTPで直接配置

/wp-content/plugins/wp-security-guard/wp-security-guard.php

方法B: zip化して管理画面からアップロード

  1. wp-security-guard.phpwp-security-guard フォルダに入れる
  2. フォルダをzip圧縮
  3. WordPress管理画面 → プラグイン → 新規追加 → プラグインのアップロード
  4. zipファイルを選択してインストール

2. 有効化

管理画面 → プラグイン → 「WP Security Guard」を有効化

3. 動作確認

管理画面左メニューに「セキュリティガード」が表示されることを確認してください。


導入時の重要作業

⚠️ .htaccess の既存XML-RPC遮断記述を削除

本プラグインを導入する場合、従来 .htaccess に記述していた以下のブロックは削除してください

削除対象の記述:

<Files "xmlrpc.php">
    Order Deny,Allow
    Deny from all
</Files>

削除理由: XML-RPC遮断はプラグイン側で行うため、.htaccess 側の記述は不要です。残しておいても動作には問題ありませんが、管理の一元化という目的に反します。

削除手順:

  1. FTP/SFTP またはサーバー管理パネルで .htaccess を開く
  2. 上記ブロックを削除
  3. ファイルを保存
  4. 外部から https://yourdomain.com/xmlrpc.php にアクセスし、403エラーが返ることを確認(プラグイン側で遮断されている証拠)

⚠️ 旧プラグインの削除

以下の旧プラグインを使用していた場合は、本プラグイン有効化後に削除してください。

  • spam-guard-cf7 - 本プラグインのCF7機能に統合済み

削除手順:

  1. 管理画面 → プラグイン → 旧プラグインを「停止」
  2. 動作確認後、「削除」

各機能の詳細と設定

管理画面「セキュリティガード」から設定できます。

セクション1: XML-RPC遮断

設定項目 デフォルト 説明
XML-RPCを遮断する 有効 xmlrpc.php へのアクセスを403で拒否

無効化が必要なケース:

  • WordPress公式モバイルアプリ(iOS/Android)から投稿したい場合
  • Jetpackを使用する場合
  • IFTTT、Zapier等で投稿自動化する場合

セクション2: ユーザー名列挙対策

設定項目 デフォルト 説明
REST APIのユーザー情報を保護 有効 /wp-json/wp/v2/users への未認証アクセスを遮断
?author=N リクエストを遮断 有効 authorクエリによるユーザー名露出を防止
ログインエラーメッセージを統一 有効 ユーザー名の存在有無を判別不能に

無効化が必要なケース:

  • author archives(著者別アーカイブページ)をサイト構造として使用している場合 → ?author=N 遮断を無効化
  • 外部システムから /wp/v2/users を利用している場合 → REST APIのユーザー情報保護を無効化

セクション3: WordPressバージョン情報の隠蔽

設定項目 デフォルト 説明
バージョン情報を隠す 有効 meta generator / RSS / CSS・JSクエリからバージョンを削除

無効化が必要なケース: 基本的になし。すべてのサイトで有効推奨。

セクション4: 認証強化

設定項目 デフォルト 説明
アプリケーションパスワードを無効化 有効 WordPress 5.6+ のアプリケーションパスワード機能を無効化

無効化が必要なケース:

  • WordPress公式モバイルアプリで REST API 経由の認証を使いたい場合
  • 外部アプリ・Zapier等との連携でアプリケーションパスワードを使用する場合

使用状況の確認方法: データベースで以下のSQLを実行

SELECT user_id, meta_value FROM wp_usermeta WHERE meta_key = '_application_passwords';

結果が0行なら無効化して問題ありません。

セクション5: Contact Form 7スパム対策

spam-guard-cf7 プラグインの全機能を引き継いでいます。 フィールドIDが your-message 以外の場合や差出人名もチェックする必要がある場合も、旧プラグインと同じUI・同じ動作で設定できます。旧プラグインを使っていたサイトでは、設定値をそのまま転記するだけで移行可能です。

設定項目 デフォルト 説明 旧プラグインからの継承
CF7スパム対策を有効化 有効 この機能群全体のON/OFF -
お問合せ本文のフィールドID your-message CF7フォームの本文フィールド名 ✓ 継承
最小日本語文字数 5 日本語文字がこの数未満ならブロック(0=制限なし) 🆕 新規
URL数の上限 3 URL数がこの数を超えたらブロック(0=制限なし) 🆕 新規
差出人名もチェックする いいえ 差出人名にも日本語チェックを適用 ✓ 継承
差出人名フィールドID your-name CF7フォームの差出人名フィールド名 ✓ 継承

フィールドID: CF7のフォーム編集画面で [textarea your-message] のように記述されている部分の your-message がフィールドIDです。フォームの実装に合わせて変更してください。

セクション6: 会員登録スパム対策

ボットによるスパム会員登録を防ぎます。WordPress標準の登録フォームと WooCommerce のマイアカウント登録フォームの両方に自動適用されます(子テーマや functions.php の変更は不要)。

設定項目 デフォルト 説明
会員登録スパム対策を有効化 有効 このモジュール全体のマスタースイッチ
wp-login.php の登録を遮断 有効 wp-login.php?action=register をトップへリダイレクト。users_can_register の設定値に依存せず遮断
JSトークン検証 有効 最も効果が高い。JavaScriptを実行しないボットを遮断
ハニーポット 有効 画面外の隠し欄が埋められた登録を拒否
フォーム最小滞在秒数 3 表示からこの秒数未満の送信を拒否(0=無効)
1IPあたりの1時間登録上限 3 同一IPからの登録回数上限(0=無効)
ユーザー名の内容検証 有効 URL・不正TLD・広告定型句・40字超を拒否
登録者宛メールを送らない 無効 ⚠️ 有効にすると正規の新規顧客もパスワード設定メールを受け取れません
管理者宛の新規登録通知を送らない 無効 管理者宛通知のみ停止(副作用小)

設計の前提と限界

  • 有効な相手: JavaScriptを実行しないスクリプト型ボット。今回ECMを攻撃したボットはこれに該当し、JSトークン単独でほぼ100%遮断できます。
  • 有効でない相手: Playwright / Puppeteer 等のヘッドレスブラウザ型攻撃。この段階に移行した場合は Cloudflare Turnstile 等のブラウザ挙動分析型対策が必要です(wpsg_registration_pre_validate フィルタで後付け可能)。
  • 英語圏の顧客が想定される場合: bonus loan transfer 等が正規のお名前に含まれ得るため、wpsg_registration_spam_keywords フィルタで該当キーワードを除外してください。
  • Cloudflare 等のプロキシ配下: レート制限は既定で REMOTE_ADDR を使用し X-Forwarded-For を信頼しません。wpsg_client_ip フィルタで CF-Connecting-IP を返す実装を追加してください。

運用手順(ECM等での想定)

  1. プラグインを更新し、セクション6を有効化
  2. 設定 > 一般 > 「誰でもユーザー登録ができるようにする」を有効に戻す(本モジュールがプラグイン側で遮断を担うため、WordPress標準設定への依存が不要になります)
  3. /my-account/ からのテスト登録で正常系(登録・メール受信・出店申請等)を確認

サイト点検モジュール

v2.1.0 で追加された、外部から派生サイトの状態を取得するための REST API モジュールです。複数の派生サイトを統合的に点検する運用を想定しています。

概要

  • 外部の点検システムが Bearer トークン認証で /wp-json/wpsg/v1/inspect/* にアクセスし、サイトのテーマ・プラグイン・WP情報などを取得する
  • 既存のセキュリティ機能とは独立して動作。一切干渉しません
  • すべての応答は JSON で、レスポンス形式は統一フォーマット

設定方法

  1. WordPress 管理画面 → 「セキュリティガード」を開く
  2. ページ末尾の「6. サイト点検設定」セクションまでスクロール
  3. 「トークンを生成」ボタンをクリック
  4. 表示された 平文トークンを安全な場所に保管 (1度しか表示されません)
  5. 必要に応じて許可IPリストを設定 (任意)

エンドポイント

エンドポイント 認証 用途
GET /wp-json/wpsg/v1/inspect/health 不要 軽量稼働確認
GET /wp-json/wpsg/v1/inspect/all 必要 全項目一括取得
GET /wp-json/wpsg/v1/inspect/core 必要 WordPress / PHP / MySQL 情報
GET /wp-json/wpsg/v1/inspect/theme 必要 有効テーマ・親テーマ・更新有無
GET /wp-json/wpsg/v1/inspect/plugins 必要 全プラグイン一覧 + 旧版残存検出
GET /wp-json/wpsg/v1/inspect/features 必要 機能フラグ (保存値・検出値・乖離)
GET /wp-json/wpsg/v1/inspect/membership 必要 会員管理プラグイン統合 (UM/WP Full Stripe/WC/WC Vendors/WP Crowdfunding/BankPay)
GET /wp-json/wpsg/v1/inspect/stripe 必要 決済設定 (Stripe/PayPal/BankPay、機微情報マスク済み)

認証ヘッダー

Authorization: Bearer <生成されたトークン>

動作確認 (curl)

# 認証不要のヘルスチェック
curl https://example.com/wp-json/wpsg/v1/inspect/health

# 認証必要なエンドポイント
curl -H "Authorization: Bearer YOUR_TOKEN_HERE" \
     https://example.com/wp-json/wpsg/v1/inspect/core

セキュリティ要件

項目 仕様
トークン保存 wp_hash_password でハッシュ化し DB 保存 (平文非保持)
トークン長 64文字 (英数字)
HTTPS 推奨
レート制限 1分60リクエスト/IP
許可IP制限 任意設定可
機微情報のマスク 将来追加予定の Stripe 鍵などは設定有無のフラグのみ返却

レスポンス共通フォーマット

{
  "success": true,
  "checked_at": "2026-04-30T14:23:11+09:00",
  "data": { /* エンドポイントごとのデータ */ },
  "warnings": [
    {
      "level": "warning",
      "code": "legacy_plugin_residual",
      "message": "旧版プラグインが残存しています",
      "details": { "files": ["..."] }
    }
  ]
}

互換性・影響範囲

確認済み互換プラグイン

以下のプラグインとの併用で問題が発生しないことを確認しています。

  • WooCommerce(本体・Stripe・Paygent等の決済ゲートウェイ・wc-vendors等)
  • Contact Form 7 / Flamingo / contact-form-7-multi-step-module
  • Limit Login Attempts Reloaded(併用推奨)
  • MailPoet / Easy WP SMTP
  • Yoast SEO / Google Site Kit / MonsterInsights
  • Advanced Custom Fields Pro
  • All-in-One WP Migration
  • その他一般的な日本語サイト向けプラグイン

注意が必要なケース

状況 影響 対応
WordPress公式モバイルアプリを使用中 XML-RPC遮断・アプリケーションパスワード無効化により動作不可 両機能を無効化
Jetpackを導入予定 XML-RPC遮断により接続不可 XML-RPC遮断を無効化
著者別アーカイブページを使用 ?author=N 遮断でアクセス不能 author遮断を無効化
一部のテーマで著者プロフィール表示 REST API経由で取得している場合に不具合の可能性 事象発生時にREST APIユーザー情報保護を無効化

Limit Login Attemptsとの関係

本プラグインは Limit Login Attempts Reloaded と併用することを推奨します。

  • 本プラグイン: 攻撃経路の遮断(予防)
  • Limit Login Attempts: 実際の試行回数制限(検知・遮断)

この2層構造により、攻撃者が経路を変えても防御できる状態になります。


動作確認方法

導入後、以下の確認を行ってください。

1. XML-RPC遮断の確認

ブラウザで https://yourdomain.com/xmlrpc.php にアクセス。 期待結果: Forbidden と表示される(403エラー)

2. REST APIユーザー情報保護の確認

ログアウトした状態でブラウザから https://yourdomain.com/wp-json/wp/v2/users にアクセス。 期待結果: {"code":"rest_no_route",...} または空の結果

3. ?author=N 遮断の確認

ブラウザで https://yourdomain.com/?author=1 にアクセス。 期待結果: トップページへリダイレクト

4. バージョン情報隠蔽の確認

サイトのHTMLソースを表示(右クリック→ソース表示)。 期待結果: <meta name="generator" content="WordPress X.X.X" /> が存在しない

5. CF7スパム対策の確認

お問い合わせフォームに英語のみのメッセージを入力して送信。 期待結果: 「英語でのお問い合わせには対応しておりません」エラーで送信がブロックされる


トラブルシューティング

Q. プラグインを有効化したらサイトが真っ白になった

A. 他のセキュリティ系プラグインや関数との競合の可能性があります。以下の手順で復旧してください。

  1. FTP/SFTPで /wp-content/plugins/wp-security-guard//wp-content/plugins/wp-security-guard-disabled/ にリネーム
  2. サイトが復旧することを確認
  3. エラーログ(/wp-content/debug.log または サーバーのエラーログ)を確認し、原因を特定

Q. ログインができなくなった

A. ログインエラー統一機能とLimit Login Attemptsの併用により、正常なエラーも「ログイン失敗」として記録される場合があります。Limit Login Attemptsの管理画面でIPロックを解除してください。

Q. モバイルアプリから投稿できない

A. XML-RPC遮断とアプリケーションパスワード無効化が原因です。どちらかまたは両方を管理画面から無効化してください。

Q. 設定変更が反映されない

A. キャッシュプラグインを使用している場合、キャッシュをクリアしてください。また、ブラウザのスーパーリロード(Ctrl+Shift+R または Cmd+Shift+R)も試してください。

Q. CF7で日本語を含む投稿もブロックされる

A. フィールドIDの設定を確認してください。CF7フォームの [textarea your-message] と管理画面の「お問合せ本文のフィールドID」が一致している必要があります。

Q. アンインストールしたい

A. 管理画面 → プラグイン → 「WP Security Guard」を停止 → 削除。 設定データ(wp_options テーブルの wp_security_guard_options)は残りますが、再インストール時に自動的に再利用されます。完全に削除したい場合は phpMyAdmin 等で該当レコードを削除してください。


変更履歴

2.0.0

統合・刷新版リリース

  • 従来 .htaccess に記述していた XML-RPC 遮断をプラグイン側に統合(Apache/Nginx問わず動作)
  • 旧プラグイン spam-guard-cf7 の全機能を統合(設定値・動作は完全継承)
  • ユーザー名列挙対策を新規追加
    • REST APIユーザー情報保護(/wp-json/wp/v2/users)
    • ?author=N リクエスト遮断
    • ログインエラーメッセージ統一
  • WordPressバージョン情報隠蔽機能を新規追加
  • アプリケーションパスワード無効化機能を新規追加
  • CF7スパム対策を強化
    • 最小日本語文字数チェック(新規)
    • URL数上限チェック(新規)
  • 管理画面を「セキュリティガード」メニューに統一
  • 各機能を個別にON/OFF可能なUIに再構成

1.0.0

初版リリース(中間版)

  • .htaccess のXML-RPC遮断記述と旧 spam-guard-cf7 プラグインを1つに統合
  • 基本機能: XML-RPC遮断、Contact Form 7 日本語チェック

旧 spam-guard-cf7 プラグイン(本プラグインの前身)

  • Contact Form 7 の本文フィールドに日本語(ひらがな/カタカナ/漢字)が含まれない投稿をブロック
  • 差出人名フィールドのチェック機能(オプション)
  • フィールドIDのカスタマイズ機能

ライセンス

GPL v2 or later

サポート

本プラグインに関する質問や不具合報告は、管理者までお問い合わせください。

About

【MS・OS・LC・ECM・CRMS・LCF】 システム共通セキュリティプラグイン

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages