- ベストアンサー
フォームの構築
phpで以下のような流れのフォームをつくっています。 基盤となる流れで問合せでも会員登録でもフォームの流れは共通です。 1:入力ページ 2:確認ページ 3:送信完了ページ ※入力ページと確認ページでは、自分自身にPOSTしてます 入力ページで送信ボタンを押すとデータチェック(未入力や妥当性)を行います。 ここでエラーがあればエラーメッセージを各フォームの項目の下に表示しページ移管しません。 エラーがない場合にはPOST値をSESSIONに格納し確認ページへリダイレクトします。 ※確認ページの各項目の表示値はSESSION値を利用 確認ページのボタンは送信ボタンのみで戻るボタンは用意していません。必要であればブラウザの戻るで戻ります。 送信ボタンを押すと送信完了ページへリダイレクトしメール送信等の必要な処理を行います。 いちいちSESSIONを利用しないでPOSTで済ませるべきという意見もあるのですが一般的にどちらがいいのでしょうか? 確かにSESSIONを利用しない場合、処理は楽になる事もあるのですがPOSTした瞬間に ページ移管してしまうので各フォームの下にエラーメッセージの表示はできないですよね? また、hiddenを使う事によって目には見えないもののソース上では見れるので セキュリティ的にもあまりよくないという事もあるのでどちらがいいものか迷っております。 問題なく動作はしているので構築方法についてアドバイスやいい方法がありましたら教えてください!
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#2です。 #2の補足の件、既に経験済みのようですので、俺からアドバイスできることは何もありません。 #2で俺が言った「回避」は「有効期限切れ」を回避するだけの話しでした。 > 仮に戻るボタンを用意しても全員がボタンで戻るのは考え難いですよね? そうですね。基本的に利用者を縛るのは無理です。 製作者が予期しない事をしてくれるのが利用者です。 今となっては、現実的ではない方法かもしれませんが、「セッションもどき」はやったことがあります。 昔の携帯はセッションも使えないものもあり、読み込めるbyte制限もきつく、 hiddenもセッションも使えないことがありました。 しかたがないので、32文字のユニークなID(つまりはSIDの代わり)をつけたテキストファイルを作り、 それに書き込んでいた事はあります。
その他の回答 (4)
- hogehoge78
- ベストアンサー率80% (433/539)
フォームは、なんど作っても何をやっても不安ばかりで、これだ!っていうベストな方法ってなかなかないですよね。 近年申し込みフォームなどを作成するにあたって、参考にしたサイトを下記に並べます。 http://www.jumperz.net/texts/csrf.htm CSRF対策(ワンタイムトークンとか)全般的な話 http://www.asahi-net.or.jp/~wv7y-kmr/memo/php_security.html WEBアプリケーションの全般的なセキュリティの知識として http://en.yummy.stripper.jp/?eid=836846 確認画面でhiddenに入力値を埋め込むのはセキュリティ的にダメか? http://www.phppro.jp/school/security/ PHP Proのがる先生のセキュリティ講座 一応、三番目に挙げたサイトにあるように、hiddenでも構わないと思います。 ※カード番号などキャッシュにちょっとでも残ると嫌な項目がない限りは。 ただし、最初の画面→(バリデート)→確認画面→(バリデート)→完了 というように、リクエストの最後にかならずバリデート(検証)をする流れは必ず行った方がいいです(それがSESSIONを利用していても。)
- bm_hiro
- ベストアンサー率51% (200/388)
#2です。 先の回答では失礼しました。 実際にやってみたほうが、自分で覚えると思いましたので、 あのようなふざけた書き方をしてしまいました。 回避する方法もあるのですが、セッションを使った上で、 ブラウザの戻るボタンを使用されると「有効期限切れ」画面が出ます。
- bm_hiro
- ベストアンサー率51% (200/388)
> エラーがない場合にはPOST値をSESSIONに格納し確認ページへリダイレクトします。 > 必要であればブラウザの戻るで戻ります。 セッションを使った上で、ブラウザの戻るボタン。。。 ん?これって。。。 (なぞを残したまま消える)
補足
本当に困っていたので質問させていただいております。このような回答はご遠慮ください。
- yambejp
- ベストアンサー率51% (3827/7415)
hiddenで処理をすると、ページの変遷の際に化ける可能性があるので sessionでやる方が確実性があがります。 セキュリティ的にはどちらにしろユーザーから一度はデータが 送られてくる処理なので、対して変わらないと思います。 また、確認画面に「送信」しかないのはユーザーインタフェースとしては 最悪の部類です。必ずしも「戻る」がなくても構いませんが、 戻れないなら、キャンセルでもいいのでボタンを用意してください。
補足
お返事ありがとうございます。 セッションの方が確実性ありという事なのでこのままセッションで進みたいと思います。 >確認画面に「送信」しかないのはユーザーインタフェースとしては最悪の部類です。 戻る人はブラウザの戻るボタンで戻るのであえて設置しなくてもいいものかと考えておりました。 ユーザビリティを考えるとやはりキャンセルはつけようかと思います。 対応策としては、セッションを破棄して入力画面にリダイレクトさせるくらいで十分でしょうか?
補足
お返事ありがとうございます。 IEで起こる現象ですよね。以前にsession_cache_limiterで(確か)privateを設定すると 戻る際の期限切れはなくなったのですがブラウザのキャッシュが残ってしまいファイルを いくら更新してもブラウザの一時ファイルを削除しない限り更新されないという現象に なった事があります。 そこからセッションを利用するのであればIEはしょうがないものかと思っているのですが 対応策はありますか? 仮に戻るボタンを用意しても全員がボタンで戻るのは考え難いですよね?