アプリ版:「スタンプのみでお礼する」機能のリリースについて

PHPでフォームを作成しています。
シンプルに、index.php から申し込んで thansk.php でメッセージと確認メールの送信を行っています。

ただ現在の状態だと、リロードなどは対策を行ったのですが、thanks.phpから戻るボタンで戻った際に、申し込んだ内容がそのまま残っていて、再度申し込みボタンを押すと簡単に申し込みが行えてしまいます。

こういった場合にはどのような対策をとったらよいでしょうか?

sessionとかcookie云々といった内容も見かけたので、これらを破棄したり色々試してみたのですが、効果は無く、この辺りは関係が無さそうでした。
お詳しい方いらっしゃいましたら、アドバイス頂けないでしょうか。
宜しくお願いいたします。

A 回答 (3件)

そのフォームには CSRF の脆弱性があると推測されます


https://www.ipa.go.jp/security/vuln/websecurity- …

悪意ある外部からの攻撃なり、ご提示のような単純な操作ミスなりで、
予期しない処理が起きてしまうのは問題ですので対策しましょう。

上記解説ページに根本的解決 6-(i)-a として挙げられている秘密情報が今回の対策となると思います。

例)
index のフォームに一度しか使えない秘密情報を埋め込み
thanks の処理前に秘密情報を検証する
秘密情報が正しければ入力を受理し、不正なら弾く
一度しか使えないので「再度申し込みボタンを押す」は不正として弾く

具体的な実装ポイントとしては、
* 秘密情報は <input type=hidden> で埋め込み
* 秘密情報の検証は、セッション情報に保管しておいた値と比較
* 検証したらセッション情報から削除して、一度しか使えない条件を守る
    • good
    • 0

こんにちは



loadイベントで、入力要素をクリアすればできるのではと思いましたが、最近の fx では HistryBack の際には load イベントが発生しないようですね。(Chromeでは発生しますけれど・・)

以下、ご参考までに・・
簡単に試してみただけですが、windowの pageshow イベントが使えそうな気がします。
https://developer.mozilla.org/ja/docs/Web/API/Wi …

MDNによれば「タブ移動でも発生する」とありますが、少なくともchrome、fxでは発生しないようです。
(タブ移動でクリアされても困るでしょうから・・)
とは言え、各種ブラウザ、スマホで確認してたわけではありませんので、質問者様の方でご確認なさってください。

もう少し確実に行うなら、送信の記録を残しておけばよさそうですね。
1)送信時にcookie等に送信日時を記録する。
2)pageshowイベントで、cookieを読み込み送信記録があれば入力値と送信記録をクリアする。

こちらの場合は、入力中にリンクや直接入力などで他ページへ飛んで、Backで戻れば、入力中の値は保持されている状態になると思います。(送信を行っていないので・・)
    • good
    • 0
この回答へのお礼

有難うございます。
貴重な情報有難うございます、pageshowのイベントなるものを知りませんでした。
関連して、eventのpersisted プロパティというもの、このようなものがあるのかと…。
色々と試してみたいと思います。
※sessionとcookieはthanks.php側で破棄しているのですが…。TT

お礼日時:2023/02/17 22:01

ダメ元でお試しください


入力した内容の項目を左クリックで反転させてクリックしたままDeleteキーを押してみてください
これで消えるはずですが消えなかった申し訳無いです
    • good
    • 0
この回答へのお礼

有難うございます。
プログラム的な指定で表示されないようにしたいです。

お礼日時:2023/02/17 14:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています