WordPressで技術ブログを書いていると、記事を保存または公開しようとした瞬間に「更新に失敗しました。 返答が正しいJSONレスポンスではありません。」というエラーメッセージが表示され、保存できないことがある。
サーバーのログを確認しても明確なエラーが出ていない場合、その原因の多くはWAF(Web Application Firewall)による誤検知である。特にPythonなどのプログラムコードを記事タイトルやURL(スラッグ)に含めようとした際に発生しやすい。
本記事では、具体的にどのようなキーワードがセキュリティフィルターに引っかかるのか、そのメカニズムと回避策を解説する。
原因:WAFによる攻撃判定
このエラーの本質は、WordPressの不具合ではなく、レンタルサーバー等に導入されているセキュリティ機能(WAF)が、保存しようとしたデータを「攻撃」とみなして遮断したことにある。
WordPressは記事保存時に、タイトルや本文のデータをサーバーへ送信する。そのデータの中に、SQLインジェクションやOSコマンドインジェクションなどの攻撃コードに似た文字列が含まれていると、WAFが通信をブロックし、その結果としてWordPress側が正常な応答(JSON)を受け取れずエラーとなる。
具体的にブロックされる文字列のパターン
技術記事のタイトルによく使われる表現でも、WAFの視点では「危険な攻撃」に見えるものがある。以下は、実際にブロック対象となりやすいPythonコードの例とその理由である。
1. 条件式と特殊記号(SQLインジェクション疑い)
対象例:
if __name__ == "__main__":
この文字列は以下の理由で危険視される。
==(比較演算子)と"(ダブルクォート): SQLインジェクション攻撃では、データベースを操作するためにOR "1"="1"のような真偽判定を送信する。タイトルの条件式がこのパターンに類似していると判定される。__(アンダースコア): システム内部の変数を操作しようとする試みと誤認される場合がある。
2. ファイルシステム操作(OSコマンドインジェクション疑い)
対象例:
os.path.exists,isfile,isdir
これらはサーバーに対する直接的な攻撃とみなされやすい、最も感度の高いキーワードである。
os.やpath: サーバー内の重要ファイル(/etc/passwdなど)へアクセスを試みる「ディレクトリトラバーサル」や、OSのコマンドを不正実行する攻撃に見える。- Linuxコマンドとの重複: Pythonのメソッド名はLinuxコマンドと類似しているものが多く、サーバー操作の命令文として検知される。
3. 関数呼び出し(XSS疑い)
対象例:
int(),float()
単純な型変換の関数に見えるが、これもブロック対象になることがある。
()(カッコ): カッコは関数の実行を意味する。これがJavaScriptの実行(<script>alert()</script>など)を意図したクロスサイトスクリプティング(XSS)攻撃の一部であると判定される。
回避策
WAFの設定を無効化すれば保存は可能になるが、セキュリティリスクが高まるため推奨されない。以下の手順で回避するのが適切である。
URL(スラッグ)からコードを除外する
WordPressはデフォルトで、記事タイトルをそのままURL(スラッグ)に変換しようとする。タイトルにコードが含まれていると、URLにも .../python-os-path-exists のように危険なキーワードが含まれてしまい、これがWAFに検知される。
- 記事のタイトルを一時的に「python-file-check」などの無害な文字列にする。
- 下書き保存をする(これでURLが確定する)。
- URL(スラッグ)を編集し、コードを含まない英単語のみにする。
- 記事タイトルを本来入れたかったコード入りのものに戻して保存する。
多くの場合、URLさえクリーンであれば、タイトル自体にコードが含まれていても保存できるケースが多い。
記号を全角にする
タイトルに含まれる半角記号が検知トリガーとなっている場合、これらを全角に置換することで回避できる。WAFのルールの多くは半角英数字(ASCII文字)を対象としているためである。
"(半角) →”(全角)()(半角) →()(全角)==(半角) →==(全角)
読者がコピー&ペーストして使うことを想定する場合は本文中にコードブロックを用意し、タイトルはあくまで見出しとして全角記号で見栄えを整えるのが現実的な解となる。
