セッションIDを用いたログイン機能の実装について - PHPプロ!Q&A掲示板

3271

  • 0P

セッションIDを用いたログイン機能の実装について

質問日時 / 2011年6月23日 15:04    回答数 / 4件

Questioner:  nagaihiro  このエントリーをはてなブックマークに追加 

キーワード / セッションID    ログイン    PHP   

現在PHPを使って会員制サイトを作ろうとしています。
ログイン状態の管理にセッションIDを使おうかと思っているのですが
よく分からない部分が出てきたので質問させてください。

まず、ログイン状態の管理の流れですが、下記のようなもので大丈夫でしょうか。

1.ユーザがログイン認証通過
2.クッキーとDBにセッションIDを保存
3.会員専用ページを閲覧時にセッションIDが同一であれば
  ログイン中であると判断し、同一でなければ(またはクッキーが空)ログインページへ飛ばす。

4.ログアウト処理時にクッキーとDBからセッションIDを破棄

セッションIDをクッキーに保存していない状態で
alert(document.cookie)をしてみたところ、sidとPHPSESSIDという
名前でランダムな文字列が表示されたのですが、ユーザがページを
閲覧した時点で自動でセッションIDがブラウザに割り振られているのものなのでしょうか。

分かりにくい文章で申し訳ありませんが
よろしくお願いいたします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01shimix>セッションIDをクッキーに保存していない状態で
 ┗A01-1nagaihiroご回答ありがとうございます。 session_startをした
  ┣A01-1-1kende横から けんでです >セッションIDを使うと何かメ
  ┗A01-1-2shimixセッションIDは、session_regenerate_id()を使って定

回答一覧

並び替え:

A01
answerershimix [6月23日 16:13] (最終編集:6月23日 16:14)

>セッションIDをクッキーに保存していない状態で

わざわざ「Cookieに保存」というのはどういう意味でしょうか?セッションを開始した時点で(session_start()を実行した時点で)CookieにはセッションIDが記録されます。なのでブラウザ側でCookieをチェックすればセッションIDが存在するのが普通です。

http://www.php.net/manual/ja/session.idpassing.php

  1. <?php
  2. session_start();
  3. print SID;
  4. ?>
  5. <script type="text/javascript">
  6. alert(document.cookie);
  7. </script>

この意見に回答する

ツリーへ TOPへ

A01-1
replyernagaihiro [6月24日 10:36]

ご回答ありがとうございます。
session_startをした時点でクッキーにセッションIDが保存されているので
sidとPHPSESSIDに既に値が入っていたのですね!

ということは、ログインに成功した時点でセッションIDをDBに保存し
その後はDBのセッションIDとクッキーに入ってるセッションIDが同一が検査して
同じならログイン中という事にすればよろしいでしょうか。

ただひとつふと思ったんですが、別にセッションID等使わずに
ログインが成功したらセッション変数にユーザ名を保存し
その後の会員専用ページでセッション変数にユーザ名が入っていたら
ログイン中とする。というような実装でもいいような気がしました。

セッションIDを使うと何かメリット等があるのでしょうか。

この意見に回答する

ツリーへ TOPへ

A01-1-1
replyerkende [6月24日 14:00]

横から けんでです

>セッションIDを使うと何かメリット等があるのでしょうか。


例えば、ログイン成功
セッション変数[ユーザ名] = "Aさん"

Aさんがセッション変数を改竄
    (クライアントが自分のセッションIDを書き換えてサイトにアクセスするのは難しくない)
セッション変数[ユーザ名] = "Bさん"

セッション処理周りの実装がまずいと・・
会員ページでBさんの会員情報をAさんに表示! => 個人情報の漏洩


なんてことも考えられなくはありません。
セッションIDとして想像しにくい適度な長さの意味のない文字列を利用することは、セキュリティ向上に貢献していると言えるのではないでしょうか。

この意見に回答する

ツリーへ TOPへ

A01-1-2
replyershimix [6月24日 16:47] (最終編集:6月24日 16:50)

セッションIDは、session_regenerate_id()を使って定期的に変更する必要があります。

 ・http://www.php.net/manual/ja/function.session-regenerate-id.php

#理由については、このサイトのphp講座のセキュリティ関係の記事を読んでください。

php5.1.0以降で第二引数にtrueを指定すれば古いセッションIDに紐付けられた内容は破棄されます。逆に言えばそう{しない|できない}場合で(古いセッションIDを)session_destroyしなければ古いセッションIDでも(その時点までの)紐付けられていた内容にアクセス出来てしまうことを意味します。そういう場合には「そのユーザの最新のセッションID」を比較してチェックすること自体は無意味ではないと思います。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
セッションがいいのか、それともデータベースがいいのか教えて下さい。
 このエントリーをはてなブックマークに追加 
A
>ボタンをクリックしたら選んだ商品情報を持っておきたいと思っています。 そのくらいのことならセッションもしくはCookie(期限短め:場合によってはブラウザ閉じるまで)でいいんじゃないですかね。 #わ...

>>続きを読む

一つの目安として、ECサイトの購入情報など絶対に消えてはいけないものはDBに、カートなどの一時的に使用する情報や、ユーザに任意のタイミングで消去されても構わないものはセッションにと使い分けるといいでしょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)