inc2734 / mw-wp-form

69 stars 46 forks source link

IE、Edgeで二重送信 #59

Open tomothumb opened 7 years ago

tomothumb commented 7 years ago

chromeなどでは問題ないんですが、 IE最新版やEdgeで、 一度送信したあと、ブラウザの戻るボタンから確認画面へ戻り、再度送信しますと、許可され重複送信となります。 別の投稿として認識され、メールも2通おくられます。 ファイル添付した場合は、画像が2つ登録されてしまいます。

Javascriptで、disableのタイミング調整してみましたが、改善されなかったです。

完了画面から戻った場合htmlソースはもちろん確認画面のものに戻るので、 hiddenのtokenは、初回と同じものがはいっています。

で、再送信を行った場合に、tokenチェックをくぐり抜けてるとなると、 IE系の場合は、ブラウザバックでSession情報までも復元されてしまうのかな?と感じてしまう不思議な挙動です。

セッションのクリアができていないか、 nonce / token周りの処理があやしい気がします。 もし解決できたらプルリク送ります。

とりあえず、報告でした。

inc2734 commented 7 years ago

MW WP Form は WordPress 標準のトークン処理(wp_create_nonce())を使っているので、確かトークンの生存時間が12時間か24時間だったと思います。なのでブラウザバックで確認画面が表示されてしまうという時点で、トークンによるチェックで防ぐのは難しそうな気がします…。

送信した後セッション情報は消しているので、本来であれば確認画面は表示されないはずなのですが、キャッシュしたページを表示する場合はセッションの有無は判定されない、という感じなのでしょうかね…

tomothumb commented 7 years ago

WordPress 標準のトークン処理(wp_create_nonce())を使っているので、確かトークンの生存時間が12時間か24時間だったと思います

いろいろ調べてましたが、そんな感じみたいですね。

フォームのユースケースとして、メール通知のみですと、2通来ちゃったよねと、さほど影響する事は少ないと思うんですが、 データ保管する場合は2通分のログが残りますし、 ファイル添付してもメディアが2つたまっちゃいますね。

直接、ポストタイプに保存するような処理を行ってて、重複ログがいっぱいあったので、気付いた次第でした。

送信した後セッション情報は消しているので、本来であれば確認画面は表示されないはずなのですが

そうですよね。他のブラウザでしたら、このようなことになりませんでしたので。

もうちょっと調べてみます。