投稿フォームなどの古典的パターンとして
・入力画面
・確認画面
・完了画面
の3つの画面を作り、
・入力画面 → 投稿フォーム
・確認画面 → POST or GET でフォーム内容を受取。$_SESSION へ保存
・完了画面 → フォーム内容を $_SESSION で受取
というモノがあると思いますが、完了画面への情報伝達に、$_SESSION を使用するのは、セキュリティ的な意味があるのでしょうか?
投稿内容であれば、ユーザの参照・改竄を気にする必要性を感じないため、hidden で良い気がします。
今時3画面使って投稿なんてしないよ!ってそもそも論もありそうですが、ご教示いただけると幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
セッションに格納するメリット
- 明示的にトークンで対策していなくても,単純に一発本家のURLを踏むだけでアウトになるパターンは免れることができる。(但し,第三者のサイトに仕掛けられた**「確認画面と実行画面のURLを
iframe
にて時間差で読み込む」**などのURLを踏んでしまうとアウト。結局不完全な対策に過ぎない) - 2回目のバリデーションは「セッションに値が入っているか」だけで済む。
HTMLに書き出して再度送信させるメリット
- サーバサイドのステート数が減少し,プログラム全体の見通しが良くなる。
個人的にはもちろん後者が好みです。CSRF対策を完璧にしようと思ったらトークンは不可欠ですし,バリデーションロジックを共通化しておけば余分にコードを書く必要もないからです。
セッションにいったん入れておくというやり方を助長しているのは,**「確認画面にはそれ専用のPHPファイルを用意する」(画面とファイルが1対1で対応する)**というやり方が入門書で採用されやすい,という背景もあるでしょう。バリデーションロジックの共通化,なんでもないように見えますが,初心者からすると少々面倒なものかもしれません。
もとより,入力画面と確認画面を分けなければいいだけの話なんですが,HTMLのbody要素の中にロジックごと書き殴っていくタイプのやり方だと出し分けも難しいでしょう。これはもう完全に本が悪いのですが,PHP関連書籍は平均的に著者の技術力が低いというのも影響していそうですね…
投稿2017/05/03 23:28
編集2017/05/04 12:07総合スコア5223
0
完了画面への情報伝達に、$_SESSION を使用するのは、セキュリティ的な意味があるのでしょうか?
セキュリティの観点からは、その方法を使うことで得られるメリットは多くないと思います。「CSRF対策でセッションを使用したから、フォームの内容もセッションで管理してしまおう」という判断なのか、「hidden属性を使うと入力チェックが再び必要になるのが面倒だ」と考えたのか、いずれにせよ、セキュリティとはあまり関係のないところでセッションを使うことを決めているのではないかと。
投稿内容であれば、ユーザの参照・改竄を気にする必要性を感じないため、hidden で良い気がします。
hidden属性、セッションのどちらを用いる場合でも不正な値が入力されることや、入力した値が参照・改竄されることは考慮していなければならないので、適切に検証やエスケープなどの処理が行えるならばどちらを用いても問題はないように感じます。個人的にはhidden属性を使うほうが好みですが...。
投稿2017/05/03 13:55
総合スコア14731
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
私自身は入力内容をセッションに入れない派なので推測ですが、
・バリデーションの回数を減らす
・完了画面で入力内容に基づいた表示をしたい
ではないかと
前者はすでに回答がありますね
後者は、完了画面をリダイレクト表示する場合に必要になるかと
あるいは、単にステートフルな開発に慣れた人がWEB開発に来ただけかもしれませんね
投稿2017/05/04 00:58
編集2017/05/04 01:00総合スコア195
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/05/04 01:24
2017/05/04 02:04
退会済みユーザー
2017/05/04 03:15
0
Formデータだけで投稿できる場合、なりすまし投稿が可能となります。
そういう掲示板Aがあるとして、被害者Xさんが、悪者Yさんのウェブページを踏んでしまった場合、XさんのブラウザからYさんの意図通りの投稿をAに対して行わせることが出来ます。XさんがAの存在を知らなくても可能です。
犯罪予告が投稿され、警察が投稿者のIPアドレスを調べて身元を割り出して、Xさんを逮捕するとかあり得ます。まあ、最近は警察もこういうことがあり得ると知っているので、すぐに逮捕は無いでしょうけど、有力容疑者なので取り調べはあるでしょうね。
詳しくは、クロスサイトリクエストフォージェリ (cross-site request forgeries) という攻撃手法について調べてみてください。これはセッションを使えば即解決すると言うことでは無く、ちゃんと対策が必要です。
投稿2017/05/03 11:24
総合スコア85888
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/05/03 11:47
2017/05/03 12:03
退会済みユーザー
2017/05/03 12:21
2017/05/03 15:25
退会済みユーザー
2017/05/03 16:10
2017/05/03 16:33
退会済みユーザー
2017/05/03 22:31
0
ご回答いただいた方、ありがとうございました。
私としては、「セキュリティ観点で、確認画面から完了画面への情報伝達に、$_SESSION を使うこと事は意味はある」という回答を期待しての質問だったので、正直、困惑していますが、頂いた回答は非常に私自身の感覚と近いので理解しやすかったです。
もし、「$_SESSION を使うこと事にセキュリティ的な意味がある」という回答をお持ちの方がいれば、追記いただけるとうれしいです。
追記 2018/02/22
上の tweet みてふと思ったんですが、(あんまりないと思うけど)パスワードを $_SESSION で引き回す場合は、ちゃんと処理しないと、生パスワードがサーバ上に残っちゃったりしますね。。。
投稿2017/05/11 06:27
編集2018/02/22 05:49退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/05/04 00:06
2017/05/04 11:48
2017/05/04 12:03