問題の症状
WordPress 6.7以降のサイトエディター(Site Editor)で、フロントページなどのテンプレートを編集・保存しようとすると、以下のエラーが発生することがあります:
更新に失敗しました。 返答が正しい JSON レスポンスではありません。
ブラウザのDevToolsで確認すると、以下のような 403 Forbidden エラーが表示されます:
POST /wp-json/wp/v2/templates/テーマ名/front-page 403 (Forbidden)
原因の調査と特定
1. 一般的な原因ではない
最初に疑われがちな以下の原因は、今回のケースでは該当しませんでした:
- プラグインの競合
- ユーザー権限の問題
- メモリ不足
- サーバーの権限設定
- WordPress本体の不具合
2. 真の原因:WAFによる誤検知
実際の原因は、レンタルサーバーのWAF(Web Application Firewall)による誤検知でした。
具体的な検知内容
サーバーのWAFログには以下のような記録が残されていました:
クロスサイトスクリプティングの試みの可能性11({x:window.onunload=alert})
なぜ誤検知されるのか
WordPressのブロックエディターは、スタイル情報を以下のようなJSON形式で送信します:
{
"style": {
"spacing": {
"padding": {
"top": "var:preset|spacing|50",
"bottom": "var:preset|spacing|50"
},
"margin": {
"top": "0",
"bottom": "0"
}
}
}
}
WAFは、この正当なJSON構造を XSS攻撃パターン {x:window.onunload=alert}
と誤認識してブロックしてしまいます。
問題の再現と検証方法
1. 段階的なテスト
以下の手順で問題を再現できます:
- 空のフロントページを作成 → 成功
- 簡単なコンテンツを追加 → 成功
- スタイル設定(余白など)を追加 → 403エラー発生
2. ブラウザのDevToolsで確認
- F12キーでDevToolsを開く
- Networkタブを選択
- サイトエディターで保存を実行
- 失敗したリクエストの詳細を確認
Request Headers で以下を確認:
x-wp-nonce: [数字]
content-type: application/json
Response Headers で以下を確認:
content-type: text/html; charset=UTF-8 ← 本来はapplication/jsonであるべき
3. WAFログの確認
レンタルサーバーの管理画面でWAFログを確認すると、クロスサイトスクリプティングの検知履歴が見つかります。
解決方法
Option 1: WAFの除外設定(推奨)
対象URL:
/wp-json/wp/v2/templates/*
除外理由:
WordPress Site Editor の正当なリクエスト
セキュリティ上の考慮事項
低リスクの環境(推奨):
- 管理者が1人のみ
- 小〜中規模サイト(1000PV/日以下)
- 高価値ターゲットではない
高リスクの環境(慎重に検討):
- 複数の管理者がいる
- 大規模サイト
- 企業サイトなど重要なサイト
Option 2: 代替手段
除外設定が困難な場合は、以下の代替手段を検討:
- クラシックエディターの使用
- テーマファイルの直接編集
- WordPress更新待ち
対策後の確認
WAFの除外設定を行った後、以下を確認してください:
- サイトエディターで正常に保存できるか
- 他のWordPress機能に影響がないか
- セキュリティログに異常がないか
予防策
1. 定期的な更新
- WordPressコアの更新
- テーマの更新
- プラグインの更新
2. セキュリティ対策の維持
- 強力なパスワードの使用
- 定期的なバックアップ
- ログイン試行制限の確認
3. 情報収集
- WordPress公式フォーラムの確認
- レンタルサーバーのお知らせ確認
- セキュリティ情報の収集
まとめ
この問題は、WordPressの正当な機能とサーバーセキュリティ機能の互換性問題が原因です。
重要なポイント:
- エラーメッセージだけでは原因特定困難
- ブラウザのDevToolsでの詳細調査が必要
- WAFログの確認が決定的な証拠
- 適切な除外設定で解決可能
同様の問題に遭遇した場合は、まずサーバーのWAFログを確認することをお勧めします。
参考情報:
- WordPress Version: 6.7+
- Twenty Twenty-Five テーマ使用時に特に発生しやすい
- レンタルサーバーの種類によって検知パターンが異なる場合あり
今回はOnameのレンタルサーバーでした。
この記事が同じ問題で困っている方のお役に立てれば幸いです。