• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:phpのセッションについて質問です)

phpのセッションについて質問です

このQ&Aのポイント
  • phpのセッションについて学習中です。セッションを使った認証の流れやセッションハイジャック対策、セッションIDの受け渡し方法、セッションの有無のチェック、メールアドレスとパスワードでのログイン認証について質問があります。
  • また、セッションIDを$SESSION変数に格納する際のセキュリティ上のリスクについても知りたいです。お分かりになる範囲でご回答頂けると助かります。
  • 最後に、セッションの基本的な知識も教えて頂けると嬉しいです。

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.2

まとめ記事↓ http://qiita.com/mpyw/items/7852213f478e8c5a2802 >> ログインフォーム画面で、session_start()し、ログインの認証が成功したらsession_regenerate_idで新しいセッションを発行⇒ログインが必要な画面でセッションの有無を確認 そんな感じです。ログインが必要な画面なのに未ログイン状態またはログインしていてはいけない画面なのにログイン状態のときなどはheader+exitで処理します。 >> セッションハイジャック対策にsession_regenerate_idをするようですが、これは全てのページで毎回行ったほうが良いのでしょうか? 全てのページで行うには負荷がかかりすぎるので、ログイン成功直後だけで十分です。ただ、もちろん第1引数はtrueにしてください。 >> セッションIDの受け渡しはcookieに保存する方法とURLに含む方法があり、セッションハイジャック対策について記述しているサイトではcookieが推奨されている雰囲気ですが、PHPマニュアル(http://php.net/manual/ja/session.idpassing.php)では信頼性がないとあります。どちらを使うのが良いのでしょうか? Cookie1択です。URLで渡す方法にはさまざまな危険が付きまといます。まとめ記事中で説明しているので探してください。 >> セッションの有無のチェックはsession_start()を記述するだけでサーバーが行ってくれるのでしょうか?$SESSIONにセッションIDを保存してissetで調べるといった記述が必要なのでしょうか? issetを使います。例えばログイン成功後にユーザIDを格納しておくのであれば if (!isset($_SESSION['user_id'])) { ...ログイン画面へのリダイレクト... } のような処理を行います。 >> メールアドレスとパスワードでのログイン認証を実装したいのですが、 その場合、マイページでユーザー情報を表示したい際、ログイン時に入力したメールアドレスを$SESSION[email]に格納し、マイページのphpプログラムにて、$SESSION[email]に格納されたメールアドレスを検索条件にしてSELECTで他の情報を取得したら良いのでしょうか?メールアドレスを$SESSION変数で受け渡しするのはセキュリティ上危険でしょうか?(危険であれば内部管理用のユーザーIDを$SESSIONに格納してデータを取得しようと思います。) "平文パスワード" 以外ならどんな情報でもセッションに格納してしまって問題ありません。SELECTで該当するメールアドレスに対応するパスワードハッシュを引き出してきてpassword_verify関数でチェックするという認証方法になると思います。以前の質問も参照してください。 http://okwave.jp/qa/q8777622.html

mmm5orz
質問者

お礼

ご回答頂きありがとうございます! まとめ記事、読ませて頂いております。 まだ自分のphpの知識レベルでは理解するのにも苦労しますが、非常に為になります。

その他の回答 (1)

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

>セッションハイジャック対策にsession_regenerate_idをするようですが、 >これは全てのページで毎回行ったほうが良いのでしょうか? ログイン直後に行うだけでいいです。 >セッションIDの受け渡しはcookieに保存する方法とURLに含む方法があり、 セッションIDの受け渡しはCookieが使えるならCookieです。というかCookieが使えないようなクライアントでアクセスされても困るので「Cookieのみ」にするのが普通です。 >セッションの有無のチェックはsession_start()を記述するだけで session_start()すれば、前回までのセッション変数($_SESSION)の内容が自動的に再現されます。そのまま(特に意識せず)$_SESSIONの内容を使えます。 当然ログインしていないときには$_SESSIONの配列に何もありませんから、isset($_SESSION['user'])とかでチェックすればログインしているかどうかはわかります(ログインしたら$_SESSION['user']に値を入れておく)。 セッション変数に保持するのはメールアドレスでも内部的なIDでもいいです。どうせ外部からはわかりません(そのためのセッションです)。 #逆に外部に流出する可能性があるなら何も入れられないしww selectした全カラムを・・・なんてことは無駄なのでしませんが、「よく使うもの(名前とか)」はセッション変数に入れておいたりします。

mmm5orz
質問者

お礼

簡潔に要点を抑えたご回答ありがとうございます! php初心者なものでなんにせよセキュリティ面に大きな不安があり、 セッション変数も本当に安全なのか不安に思ってしまいました。 外部に流出する可能性がないのなら安心して使えます!