8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Wordpress] 投稿が消えた!「本当に実行していいですか?」という悪魔のメッセージ、とその対策

Last updated at Posted at 2016-01-06

Wordpressを利用しているあなたは、この画面を見たことがあるだろうか。

461dbe7e1845f978eca543f0cc152881.png

だいぶフランクに問いかけて来ているが、
経験のある方だったら、これが悪魔のメッセージであることをご存知だろう。

どんな時におきるか

ある時、WPで熱心に投稿を書いていた。
それは、1〜2時間ではなく、夜中に途中まで書き、一度パソコンの画面を閉じて、翌日また開き続きを書きだした・・・そうこれは間違いなく超大作だ。

そして、完成に近づいたところで「下書き保存」を押して、一息つこうとしたところに、例のあの画面である。

ん、、、下書き保存をしたいと思っていたので、「もう一度お試しください」を恐る恐る押してみる。

画面がリロードされた後、よくよく投稿を見ると、、、、
半分の投稿が消えている!

リビジョンは・・・ない!
戻るボタンで戻っても・・・ない!
どんなに頑張って探しても、戻ってこない。
(( ;゚Д゚))ブルブル

(これはフィクションですが、こんな感じの事が起こるんです。)

何が原因か?

原因はNonce(ノンス)とよばれるCSRF対策が施されているため発生します。

Wordpress Codex: WordPress Nonce

nonce(ノンス)は、ある種の誤使用や悪意のある操作から URL やフォームを守るための「一度だけ使われる数値」です。WordPress の nonce は実際には数値ではなく、数字と英字で作られたハッシュです。また、本当に一度だけ使われるのではなく、無効になるまでの「有効期間」を持っています。その期間では、同じユーザーの同じコンテキストに対して、同じ nonce が生成されます。つまり、ある操作に対する nonce は、nonce の有効期間が切れるまで同じユーザーについて同じ値を保ちます。

このnonceの有効期限切れが発生することによって、更新できなくなります。またnonceの有効期限切れが発生した時点で、自動保存も効かなくなります。なので、画面を開いたまま長いこと作業をするとこのような事態を引き起こしてしまうのです。

エラーは出ないの?

出てました。ただ、これはだれも気付きません。

Pasted image at 2016_01_06 04_46 PM.png

消えた文章は復旧できないの?

他に保存していなければ、復旧はできなそうでした。

有効期限はいつ切れるのか?

デフォルトでは、nonce の有効期間は 1 日です。

→24時間の設定です。

注意: WordPress の nonce が一度だけ使われる数値ではないという意味で、nonce の有効期間は本当の有効期間とは異なります。WordPress は 2 期(有効期間の半分が 1 期)のシステムを用いて、nonce を前期と後期の両方で検証します。デフォルト設定(有効期間が 24 時間)では、nonce に含まれる時刻データは、いくつの 12 時間区切りを過ぎたかチェックされます。ただし期の区切りは UNIX エポック を起点として計算されます。つまり、昼 12 時〜夜 12 時に作られた nonce は翌日の昼 12 時までの有効期間を持ちます。従って本当の有効期間は一定ではなく 12〜24 時間の間です。

→実際にはデフォルトの場合、12時間〜24時間となるようです。

どうすればよいのか?

まずWordpressのコミュニティでは、3年も前から最近もアクティブに議論されています。

Avoid losing data after nonces expire
https://core.trac.wordpress.org/ticket/24447

ただ、あまり緊急ではないということなんでしょうか。未だにOpenなチケットのようです。
セキュリティ対策上、止めてしまうのは問題なので、根本的な解決は難しいところです。

運用的対策

①ログインしなおす

nonceはユーザーごとに割り当てられた値です。ログアウト・ログインすることでリフレッシュされます。毎回、ログインし直すような習慣がいいかもしれません。

②下書き保存は押さずに、プレビューを押すようにする。

プレビューを押すと新しいタブが開きますが、その時に上記の画面が出たら、直ちにテキストをコピペして退避させましょう。退避後にリロードし、再度貼りつけ直せば大丈夫でしょう。

技術的対策

③自動保存に失敗したらアラートを出す(プラグイン)

一応エンジニアなので、最低限は技術的に解決したいものです。
現在問題なのが、アラートが出ていても全く気付けないことです。
そこで、自動保存が失敗した場合にjsでalertが出るようなプラグインを作って見ました。

Alert-Autosave-Error
https://github.com/nishiyamaosamu/Alert-Autosave-Error

まだgithub上にあるだけですが、これをプラグインディレクトリへ追加し、有効にすることで、もし万一自動保存に失敗しても、すぐに気付き退避可能になり、リスクを軽減できます。

さいごに

もしもっと良い解決方法をご存知の方がおりましたら、コメントお願いします。

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?