WordPressで「更新に失敗しました。返答が正しいJSON〜」が出る場合の原因と対策方法
WordPressで新規投稿や下書き保存をしようとした際に、「更新に失敗しました。返答が正しいJSONレスポンスではありません」というエラーメッセージが表示され、保存や投稿ができなくなる問題が発生しました。それまでは機能していたのに突然のエラーで焦りました。
結論から言えば、原因は「ルータの電源が落としたせいでIPアドレスが変わった」ことでした。この記事では「なぜIPアドレスが変化したらエラーが出たのか」と、その修正方法について解説します。
ある日、エラーが出るようになった
ある日、WordPressで投稿しようとしたところ、「更新に失敗しました。返答が正しい JSON レスポンスではありません」というエラーが発生して投稿できなくなりました。
それまで問題なく使えていたのに、突然このエラーが出たことで、「なぜ?!」と焦りました。
ネットで調べてみると、どうやらWAF(Web Application Firewall)が原因である可能性が高いことがわかりました
WAFとは、Webアプリケーションの脆弱性を悪用した攻撃からWebサイトを保護するセキュリティ対策の機能です。
WAFが原因かどうかチェックするために、ConohaWINGの管理画面から「サイトセキュリティ」→「WAF」を確認したところ、多数のエラー(警告)が発生していることがわかりました。
エラーの内容は、「SQLインジェクションからの防御13(’–)」というものでした。
とりあえず一時的な対処として、WAFをOFFにすることで投稿を完了させることができました。
ただ、セキュリティ機能をOFFにし続けるのも心配だし、毎回保存するたびにWAFをOFFにするのも面倒です。
そこで、根本的な原因をさらに詳しく調べることにしました。
以下、対策方法を書きますが、あくまで「私の場合」これで直ったというだけで、全員がこれで直るとは限りませんので注意してください。
原因の調査
原因を調べるために、ConohaWINGのセキュリティ画面をもう一度確認してみました。エラーの内容が「SQLインジェクションからの防御13(’–)」となっているので、SQLインジェクションの疑いがあるのが原因だとわかります。
なにが原因なのかを、調べるために、エラーとなった記事をコピーして、文章を削っては保存するという行為を繰り返してみました。
すると、
'name' : ['a', 'b', ... ]
と書かれた行でエラーが出ていることを確認できました。
SQLインジェクションでは、シングルクオート(’)を使った攻撃が行われます。どうやら、この行のシングルクオート(’)のせいでJSONエラーが発生しているようです。
SQLインジェクションが発生するのは、プラグインに原因があるように思われますが、必要なプラグインしか入れていないので、プラグインを削除することはできません。ということで、他の方法での対策を見つける必要がありました。
さらに原因を調査する
さらに原因を特定するために、新規記事を作成し、タイトルは「テスト」、記事にシングルクオーと(’)だけを書いて下書き保存をクリックしてみました。
すると、見事に「更新に失敗しました。返答が正しい JSON レスポンスではありません」というメッセージが現れるではないですか!
こんな1文字の記事でもエラーが発生してしまいます。「これまでずっと、こんなエラーは発生していなかったのになぜ?」と思いました。
原因を特定するために色々試行錯誤しているときに、ConohaWINGのWAFページに「表示切り替え」メニューがあることに気づきました。
これを「ログ」から「除外中」に切り替えて見ると、その他という設定を見つけました。
この行、どうやらIPアドレスを指定してWAFのセキュリティ機能をOFFしているようです。
これをみて、一年くらい前に自宅のIPアドレスをWAFのセキュリティから除外していたことを思い出しました。
数日前にルータの電源を切ったのが原因
実は、数日前にテーブルタップを入れ替えを行いました。この時、フレッツ光のルーターの電源をOFFにしました。
我が家は固定IPではないので、ルータの電源をOFFにして再度ONにするとIPアドレスの割り当てが変わってしまいます。
1年以上電源を入れっぱなしで、この間ずっとIPアドレスが変わっていませんでした。
たしか、最初にConohaWINGを使い出したときに、「更新に失敗しました。返答が正しい JSON レスポンスではありません」というエラーが発生したために、IPアドレスを指定してWAFの除外を行なっていたのをすっかり忘れていたわけです。
設定した時は、「IPアドレスが変わったらやり直ししなくては」と思っていましたが数ヶ月したらすっかり忘れていました。
ということで、IPアドレスが変わって除外対象から外れたことが原因でした。
固定IPのサービスに契約していない場合、プロバイダから提供されるIPアドレスは、接続毎に変化します。最近は常時接続していることが多く、半年以上電源を切らない(=IPアドレスが変化しない)ことも普通です。なので、IPアドレスが変化することを忘れがちですが、固定IPでない場合はIPアドレスは変化することを忘れないようにしましょう。
WAFの除外設定する方法(IPアドレス)
原因が特定できたので現在のIPアドレスをWAFから除外します。ここでは、WAFで特定のIPアドレスを除外する方法を解説します。
.htaccess
に設定を追加する方法
IPアドレスを除外設定するには、.htaccessというファイルに以下を挿入します。
xxx.xxx.xxx.xxx
の部分には、IPアドレスが入ります。
<IfModule mod_siteguard.c>
SiteGuard_User_ExcludeSig ip(xxx.xxx.xxx.xxx)
</IfModule>
IPアドレスは、「使用中のIPアドレス確認」などのキーワードでGoogle検索などすれば確認することができますし、先ほどのConohaの「攻撃元IPアドレス」にも記載されています。
攻撃元IPアドレスを参考にする場合は、日時なども確認して自分のアクセスであることを確認しましょう。
.htaccessの書き換え方法ですが、ConohaWINGの場合は、サイト管理→サイト設定→応用設定からアクセスすることが可能です。
書き換え後、保存すればエラーが出なくなりました。
まとめ
すっかり忘れてしまっていましたが、自宅のネットワークからのアクセスだけWAFの除外とする設定をしていました。ルータの電源入れ直しでIPアドレスが変わったので、これが原因でJSONエラーが発生していたわけです。
IPアドレスは他人に割り振られるため、セキュリティホールになります。忘れずに更新しなければと思いました。
本当は固定IPが良いんですけどね。