WordPressサイト向けの統合セキュリティプラグインです。外部からの不正アクセス対策として、XML-RPC遮断・ユーザー名列挙対策・バージョン情報隠蔽・アプリケーションパスワード無効化・Contact Form 7スパム対策を1つのプラグインで管理できます。
- バージョン: 2.9.0
- 必須環境: WordPress 5.6以降 / PHP 7.4以降
- ライセンス: GPL v2 or later
本プラグイン導入前、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つで全制御できるようにしています。
xmlrpc.phpへの直接アクセスを 403 Forbidden で拒否X-PingbackHTTPヘッダーの削除pingback.pingメソッドの無効化.htaccessでの遮断記述と同等の効果
- REST APIユーザー情報保護:
/wp-json/wp/v2/usersへの未認証アクセスを遮断 ?author=N遮断:example.com/?author=1でユーザー名URLに露出するのを防止- ログインエラー統一: 「ユーザー名が違います」「パスワードが違います」を「ユーザー名またはパスワードが正しくありません」に統一
<meta name="generator">の削除- RSSフィードのgeneratorタグを空に
- CSS/JSファイルの
?ver=X.X.Xクエリ文字列を削除
- WordPress 5.6以降の「アプリケーションパスワード」機能を無効化
- REST API経由のブルートフォース攻撃経路を遮断
- 日本語必須チェック: 本文に日本語(ひらがな/カタカナ/漢字)が1文字も含まれない投稿をブロック
- 最小日本語文字数: 指定した文字数未満の日本語本文をブロック(デフォルト5文字)
- URL数上限: 本文中のURL数が指定数を超える場合ブロック(デフォルト3個)
- 差出人名チェック(オプション): 差出人名フィールドにも日本語必須チェックを適用
- 対象: 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_inbound)/アドレス帳(flamingo_contact)を個別選択で完全削除(ゴミ箱を経由しない)
- 期間指定:全期間/指定日以前/N日より古い(
post_date基準)。全ステータス(trash/spam含む)対象 - Ajaxバッチ処理(250件/回)=進捗表示・中断可・再実行で続きから。実行前プレビュー+確認ダイアログ、実行ログ20件
⚠️ アドレス帳の日付は「連絡先の作成日」基準(最終問い合わせ日ではない)
以下のいずれかの方法で wp-security-guard.php をインストールしてください。
方法A: FTP/SFTPで直接配置
/wp-content/plugins/wp-security-guard/wp-security-guard.php
方法B: zip化して管理画面からアップロード
wp-security-guard.phpをwp-security-guardフォルダに入れる- フォルダをzip圧縮
- WordPress管理画面 → プラグイン → 新規追加 → プラグインのアップロード
- zipファイルを選択してインストール
管理画面 → プラグイン → 「WP Security Guard」を有効化
管理画面左メニューに「セキュリティガード」が表示されることを確認してください。
本プラグインを導入する場合、従来 .htaccess に記述していた以下のブロックは削除してください。
削除対象の記述:
<Files "xmlrpc.php">
Order Deny,Allow
Deny from all
</Files>削除理由: XML-RPC遮断はプラグイン側で行うため、.htaccess 側の記述は不要です。残しておいても動作には問題ありませんが、管理の一元化という目的に反します。
削除手順:
- FTP/SFTP またはサーバー管理パネルで
.htaccessを開く - 上記ブロックを削除
- ファイルを保存
- 外部から
https://yourdomain.com/xmlrpc.phpにアクセスし、403エラーが返ることを確認(プラグイン側で遮断されている証拠)
以下の旧プラグインを使用していた場合は、本プラグイン有効化後に削除してください。
spam-guard-cf7- 本プラグインのCF7機能に統合済み
削除手順:
- 管理画面 → プラグイン → 旧プラグインを「停止」
- 動作確認後、「削除」
管理画面「セキュリティガード」から設定できます。
| 設定項目 | デフォルト | 説明 |
|---|---|---|
| XML-RPCを遮断する | 有効 | xmlrpc.php へのアクセスを403で拒否 |
無効化が必要なケース:
- WordPress公式モバイルアプリ(iOS/Android)から投稿したい場合
- Jetpackを使用する場合
- IFTTT、Zapier等で投稿自動化する場合
| 設定項目 | デフォルト | 説明 |
|---|---|---|
| REST APIのユーザー情報を保護 | 有効 | /wp-json/wp/v2/users への未認証アクセスを遮断 |
?author=N リクエストを遮断 |
有効 | authorクエリによるユーザー名露出を防止 |
| ログインエラーメッセージを統一 | 有効 | ユーザー名の存在有無を判別不能に |
無効化が必要なケース:
- author archives(著者別アーカイブページ)をサイト構造として使用している場合 →
?author=N遮断を無効化 - 外部システムから
/wp/v2/usersを利用している場合 → REST APIのユーザー情報保護を無効化
| 設定項目 | デフォルト | 説明 |
|---|---|---|
| バージョン情報を隠す | 有効 | meta generator / RSS / CSS・JSクエリからバージョンを削除 |
無効化が必要なケース: 基本的になし。すべてのサイトで有効推奨。
| 設定項目 | デフォルト | 説明 |
|---|---|---|
| アプリケーションパスワードを無効化 | 有効 | WordPress 5.6+ のアプリケーションパスワード機能を無効化 |
無効化が必要なケース:
- WordPress公式モバイルアプリで REST API 経由の認証を使いたい場合
- 外部アプリ・Zapier等との連携でアプリケーションパスワードを使用する場合
使用状況の確認方法: データベースで以下のSQLを実行
SELECT user_id, meta_value FROM wp_usermeta WHERE meta_key = '_application_passwords';結果が0行なら無効化して問題ありません。
旧
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です。フォームの実装に合わせて変更してください。
ボットによるスパム会員登録を防ぎます。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フィルタで後付け可能)。 - 英語圏の顧客が想定される場合:
bonusloantransfer等が正規のお名前に含まれ得るため、wpsg_registration_spam_keywordsフィルタで該当キーワードを除外してください。 - Cloudflare 等のプロキシ配下: レート制限は既定で
REMOTE_ADDRを使用しX-Forwarded-Forを信頼しません。wpsg_client_ipフィルタでCF-Connecting-IPを返す実装を追加してください。
- プラグインを更新し、セクション6を有効化
- 設定 > 一般 > 「誰でもユーザー登録ができるようにする」を有効に戻す(本モジュールがプラグイン側で遮断を担うため、WordPress標準設定への依存が不要になります)
/my-account/からのテスト登録で正常系(登録・メール受信・出店申請等)を確認
v2.1.0 で追加された、外部から派生サイトの状態を取得するための REST API モジュールです。複数の派生サイトを統合的に点検する運用を想定しています。
- 外部の点検システムが Bearer トークン認証で
/wp-json/wpsg/v1/inspect/*にアクセスし、サイトのテーマ・プラグイン・WP情報などを取得する - 既存のセキュリティ機能とは独立して動作。一切干渉しません
- すべての応答は JSON で、レスポンス形式は統一フォーマット
- WordPress 管理画面 → 「セキュリティガード」を開く
- ページ末尾の「6. サイト点検設定」セクションまでスクロール
- 「トークンを生成」ボタンをクリック
- 表示された 平文トークンを安全な場所に保管 (1度しか表示されません)
- 必要に応じて許可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 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 Reloaded と併用することを推奨します。
- 本プラグイン: 攻撃経路の遮断(予防)
- Limit Login Attempts: 実際の試行回数制限(検知・遮断)
この2層構造により、攻撃者が経路を変えても防御できる状態になります。
導入後、以下の確認を行ってください。
ブラウザで https://yourdomain.com/xmlrpc.php にアクセス。
期待結果: Forbidden と表示される(403エラー)
ログアウトした状態でブラウザから https://yourdomain.com/wp-json/wp/v2/users にアクセス。
期待結果: {"code":"rest_no_route",...} または空の結果
ブラウザで https://yourdomain.com/?author=1 にアクセス。
期待結果: トップページへリダイレクト
サイトのHTMLソースを表示(右クリック→ソース表示)。
期待結果: <meta name="generator" content="WordPress X.X.X" /> が存在しない
お問い合わせフォームに英語のみのメッセージを入力して送信。 期待結果: 「英語でのお問い合わせには対応しておりません」エラーで送信がブロックされる
A. 他のセキュリティ系プラグインや関数との競合の可能性があります。以下の手順で復旧してください。
- FTP/SFTPで
/wp-content/plugins/wp-security-guard/を/wp-content/plugins/wp-security-guard-disabled/にリネーム - サイトが復旧することを確認
- エラーログ(
/wp-content/debug.logまたは サーバーのエラーログ)を確認し、原因を特定
A. ログインエラー統一機能とLimit Login Attemptsの併用により、正常なエラーも「ログイン失敗」として記録される場合があります。Limit Login Attemptsの管理画面でIPロックを解除してください。
A. XML-RPC遮断とアプリケーションパスワード無効化が原因です。どちらかまたは両方を管理画面から無効化してください。
A. キャッシュプラグインを使用している場合、キャッシュをクリアしてください。また、ブラウザのスーパーリロード(Ctrl+Shift+R または Cmd+Shift+R)も試してください。
A. フィールドIDの設定を確認してください。CF7フォームの [textarea your-message] と管理画面の「お問合せ本文のフィールドID」が一致している必要があります。
A. 管理画面 → プラグイン → 「WP Security Guard」を停止 → 削除。
設定データ(wp_options テーブルの wp_security_guard_options)は残りますが、再インストール時に自動的に再利用されます。完全に削除したい場合は phpMyAdmin 等で該当レコードを削除してください。
統合・刷新版リリース
- 従来
.htaccessに記述していた XML-RPC 遮断をプラグイン側に統合(Apache/Nginx問わず動作) - 旧プラグイン
spam-guard-cf7の全機能を統合(設定値・動作は完全継承) - ユーザー名列挙対策を新規追加
- REST APIユーザー情報保護(
/wp-json/wp/v2/users) ?author=Nリクエスト遮断- ログインエラーメッセージ統一
- REST APIユーザー情報保護(
- WordPressバージョン情報隠蔽機能を新規追加
- アプリケーションパスワード無効化機能を新規追加
- CF7スパム対策を強化
- 最小日本語文字数チェック(新規)
- URL数上限チェック(新規)
- 管理画面を「セキュリティガード」メニューに統一
- 各機能を個別にON/OFF可能なUIに再構成
初版リリース(中間版)
.htaccessのXML-RPC遮断記述と旧spam-guard-cf7プラグインを1つに統合- 基本機能: XML-RPC遮断、Contact Form 7 日本語チェック
- Contact Form 7 の本文フィールドに日本語(ひらがな/カタカナ/漢字)が含まれない投稿をブロック
- 差出人名フィールドのチェック機能(オプション)
- フィールドIDのカスタマイズ機能
GPL v2 or later
本プラグインに関する質問や不具合報告は、管理者までお問い合わせください。