• 締切済み

セッション管理もどきを自作で

通販サイトを作ろうとしています。 ログインにはIDとPASSが必要ですが、ログイン中であることを知るためにログイン成功時にIDとPASSをそのまんまクッキーに記録しています。 その時点でセキュリティは最悪なので、セッションID管理というやつをやろうと思ったのですが、 CGI::Sessionだか何だかの説明ページが全く持って意味不明でしたので それっぽいことを自作しようと思います。 以下の流れのプログラムでセッション管理と同じような事をしていると思うのですが、あっていますか。セッション管理というものがいまいち分かりません。 ・WEBページよりIDとPASSを入力してログイン ↓ ・データベースにアクセスし、正しい情報であれば、  ランダムに作成した20桁くらいの文字列+IDをクッキーに保存、  その文字列をデータベースに保存、同時にIPアドレスも保存。  保存した時間も保存する。 (例:ID=OSIETE だったら、afkgiornsfshifownsiwOSIETE みたいな文字列になる) ↓ ・ページを移動するたびにクッキーから文字列を取得し  データベースに保存されているかを調べる。  同一の文字列および同一のIP、および保存時間が現在時刻の24時間でなければNGとする。 ↓ ・ログアウト時、クッキーに保存された文字列と同じものをデータベースから削除する

みんなの回答

  • gon987
  • ベストアンサー率16% (53/313)
回答No.2

>その時点でセキュリティは最悪なので、 CGI::Sessionの使い方がわからないレベルの質問者が自作でセッション処理を作ったところでその作ったプログラムがセキュリティーに問題がある物になる可能性が高いですから中途半端な知識で下手に自作するより CGI::Sessionが使えるようにした方がいいでしょう。

全文を見る
すると、全ての回答が全文表示されます。
  • pick52
  • ベストアンサー率35% (166/466)
回答No.1
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • セッション

    セッションとクッキーで質問です。 1.session_id()やsession_name()っていつ使うのでしょうか? ブラウザは特定できても個人を特定できるわけではないですよね?それとも ブラウザを特定して管理するためなのでしょうか? 2.自動グイン機能を実装しようと思うとき、 クッキーとサーバー側(正確にはdb)にランダムな文字列を格納し、次回サイトを訪れた際、保存している値とクッキーにある値を照合し合えばログインしたことにする。 上記のようなロジックで大丈夫でしょうか?

    • ベストアンサー
    • PHP
  • [PHP]セッション破棄について

    はじめまして。 phpを始めて1週間の初心者です。 現在、ホームページでログイン処理とログアウト処理をphpのセッションを使って作成しています。 今回質問させて頂くのはログアウト処理についてです。 ログアウト処理をでセッションを破棄する際に http://oshiete1.goo.ne.jp/qa3224862.html を参考にして下記の処理を行わせています。 -------------------- logout01.php -------------------- <?php session_start(); $_SESSION = array(); if(isset($_COOKIE[session_name()])){setcookie(session_name(),'',time()-4200,'/');} session_destroy(); header("location: http://~トップページのURL~/"); ?> -------------------- 確認をしたところ、ログインしたユーザの情報は削除されているようでした。 また、http://oshiete1.goo.ne.jp/qa3224862.htmlを参考に下記のようなログアウト処理も行わせてみました。 -------------------- logout02.php -------------------- <?php session_start(); unset($_SESSION['access']); header("location: http://~トップページのURL~/"); ?> -------------------- 同じく確認したところ、ログインしたユーザ情報は削除されているようでした。 -------------------- 環境 -------------------- <サーバ> 【OS】 windows XP(テスト環境)、CentOS 5.2(公開環境) 【PHP】 5.2.6 【Apache】 2.2 <クライアント> 【OS】 windows XP 【ブラウザ】 Firefox 3.0.8 IE 7 -------------------- -------------------- 質問 -------------------- (1)logout01.phpとlogout02.phpの違いは何でしょうか。 (2)「unset($_SESSION);」は使用すると「$_SESSION」が使えなくなるとのことですが、  それはphpを再インストールしない限りは使えなくなるということでしょうか。  それとも、ブラウザを再起動すれば使えるという意味でしょうか。 (3)「unset($_SESSION);」と「unset($_SESSION['access']);」では何が違うのでしょうか。 (3)セッションを使用するとサーバ側にセッションIDを保存したファイルが保存され、  クッキーがクライアント側に保存されるとのことですが、logout01.phpとlogout02.phpを  実行した場合、サーバ側のセッションIDを保存したファイルとクライアント側のクッキーを  保存したファイルは削除されているのでしょうか。 (4)セッションの有効期限を指定していないため、logout01.phpとlogout02.phpを実行せずに  ブラウザを終了させた時もログインしたユーザ情報は削除されているようでしたが、  この場合もサーバ側のセッションIDを保存したファイルとクライアント側のクッキーを  保存したファイルは削除されているのでしょうか。 初歩的な質問で申し訳御座いませんがよろしくお願いします。

    • ベストアンサー
    • PHP
  • phpのsessionとcookieについて

    質問は以下に2つです。 プログラムの説明は、pass,idから認証を行い、sessionidを発行します。二度目の以降はsessioidから認証します。 sidpost.phpからpostでIDとパスワードを入力させます。 データベースはid, pass, sidの3つのカラムがあります。 <?PHP require_once'DB.php'; session_name("sid"); session_start(); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <?php $id = $_POST['id']; $pass =$_POST['pass']; $cookie = $_COOKIE['sid']; $sid = session_id(); //データベース参照 //プレースホルダーを使用 //id からpassを参照する //cookie から sidを参照する $data=$sth->fetchRow(DB_FETCHMODE_ASSOC);//参照したデータを$dataの連想配列に格納 //sid保存のプレースホルダー $sth2 = $dbh->prepare('UPDATE accountid SET sid=? WHERE id=? AND pass=?'); //cookieが保存されていない場合 if(!isset($cookie) && isset($pass) && isset($id)){ //idとpassから認証 if($pass === $data['pass']){ $sth2 = $dbh->execute($sth2, array($sid, $id, $pass)); echo "初めてのログインsid登録"; } //sidがある場合cookieとデータベースのsidを比較 }else if(isset($cookie)){ if($cookie == $data['sid']) echo "sidあり成功"; //クッキーがあり、データベースと一致しない場合,sidを破棄する }else{ echo"あるはずのクッキー" .$COOKIE['sid']."<br>"; $_SESSION=array(); setcookie('sid', '', time()-3600); session_destroy(); echo "ないはずのクックキー".$_COOKIE['sid']; } //それ以外は入力フォームにリダイレクト }else{ header("location: ./sidpost.php?error=error"); } $dbh->disconnect(); ?> </body> </html> 上のようなセッション管理のプログラムを書きました。 質問は2つありまして、 ・1つめは、通常セッション管理を行う際の、条件はどのようにするのが一般的ですか? IDとパスワードがデータベースと一致する場合としない場合の2通り、cookieがある場合、ない場合の2通り、もしcookieがある場合は、データベースの値と一致する場合としない場合の2通りが考えられます。一番最適な条件文はどのようにすればよいでしょうか? またその処理はどのようにすればよいのでしょうか。 例えばcookieがあり、データベースと一致しない場合、$_SESSIONの初期化、setcookieでクッキーの削除、session_destroy()するなど。。。なにかよくわからなくなってしまいました。 ・二つ目は、 上のプログラムではじめsession_name('sid')およびsession_start()を宣言し、クライアントとサーバに$sid=session_idを発行しています。なので、$_COOKIE['sid'];の値には session_id()($sid)になっているはずです。 下のほうで、セッションの管理を行う際、 //クッキーがある場合 else if(isset($cookie)){ if($cookie == $data['sid']) echo "sidあり成功"; //クッキーがあり、データベースと一致しない場合,sidを破棄する }else{ echo"あるはずのクッキー" .$COOKIE['sid']."<br>"; $_SESSION=array(); setcookie('sid', '', time()-3600); session_destroy(); echo "ないはずのクックキー".$_COOKIE['sid']; } クッキーがあり、データベースと一致しない場合に、sessionおよび、cookieの破棄をしています。この前後でechoをもちいて$_COOKIE['sid']の値を出力すると、 破棄するの前のechoでクッキーが表示されず、 破棄したあとのechoでクッキーが表示されました。 なぜこのような結果になるのですか、逆では?と思いました。

    • 締切済み
    • PHP
  • セキュリティーを確保したセッション管理

    現在、javaにて開発を計画中です。 作成するアプリケーションは、 ログイン画面 ↓ ユーザ、パスワード入力 ↓ 認証(データベースに登録された内容チェック) ↓ ユーザごとに許可されたページへの遷移 といった流れを想定しています。 セッション管理を行なう上で、 Javaでは、「HttpSession」を利用して、   // セッション開始   HttpSession session = request.getSession(true);   // セッションに情報を設定   session.setAttribute("USER_ID" , xxxx);   session.setAttribute("PASSWORD" ,yyyy); といった情報をセッションに保存し、ページ移動時にチェック する事を考えました。 あとCookieを利用する方法も考えましたが、CookieにID、passwordを保存することは セキュリティー上問題あると思います。 セッション管理について説明しているページには、Cookieには、セッションIDを保存し・・・とった 記述があるのをよくみます。 セキュリティー上、Cookieを利用する意味もよく分かっていません。 みなさんは、どのようにセッション管理をされているのか教えてください。 出来るだけセキュリティーを確保したいと思っています。 よろしくお願いします。

    • ベストアンサー
    • Java
  • PerlモジュールのCGI::Sessionでセッション管理

    PerlモジュールのCGI::Sessionでセッション管理をしようとしています。 具体的なコードは %cookie=raw_fetch CGI::Cookie; $S_id=$cookie{'S_id'};#クッキーに保存されたセッションIDを取得 $session = new CGI::Session("driver:MySQL", "$S_id", {Handle=>$dbh}); その後 $Ses_id=$session->id(); とすると本来ならばクッキーに保存された既存のセッションID($S_id)が$Ses_idに入ると思うのですが、$Ses_idには新しいセッションIDが入ってしまいます。 そこで疑問なのですが (1)$S_idにクッキーに保存されたセッションIDを指定すると既存のセッションをオープンするのではないのでしょうか? (2)$Ses_id=$session->id();にはなぜ新しいセッションIDが入ってしまうのでしょうか? 2点の質問ですが、どうか宜しく教えてくださいまし。

  • レンタルサーバー&PHP&MySQLの環境で会員限定のデータベースを作

    レンタルサーバー&PHP&MySQLの環境で会員限定のデータベースを作成中です。 ログイン・ログアウトの処理を作成しているのですけど、いくつか質問させてください。 色々なサイトを巡り自分が解釈したログインの方法を書きます。 1.「会員登録画面」から会員情報を登録。(会員情報をMySQLに保存) 2.「ログイン画面」からフォーム(ID・PASS)を入力しボタンを押して認証。 3.入力されたデータを元にMySQLに問い合わせ会員情報の有無・情報の一致を判断 (情報がない場合はログイン画面へ) 4.セッションにID・PASSを保存。クッキーにセッションIDを保存。 5.会員限定ページに移動。セッションに保存してあるID・PASSを元にMySQLに問い合わせ一致するかどうかを判断。(していなければログイン画面へ) 6.セッションIDを更新する。以後ページを移動する度に一致しているかどうかを確認する。 このような感じになります。 ログアウトはセッション・クッキーを削除すればいいかなと思っています。 上記のような流れでいいのでしょうか。 いまいちセッションやクッキーに保存する内容をどうすればいいのか分かってない状態です。 又セキュリティ的にはどうでしょうか。データベースの改ざんや破壊されたら困るのである程度対策されたものを作成したいです。 ログイン時に自動ログインの有無のチェックボックスを設置してチェックされていたら2週間程度自動でログインされるようにもしてみたいです。 チェックされていたら自動ログインのkeyをランダム値で作成しクッキーとMySQLの会員情報に保存する。 ログインする度にkeyを更新する。(ページに移動する時も) ログアウトしたらkeyを削除する。 http://blog.ohgaki.net/espcs_if_a_fa_ia_a_pa_e_oa_a_sa_da_ca_sa ↑ここのサイトを見ました。 MySQLの会員管理なのですけど、MySQL専用のユーザー登録?(権限とか)を会員毎に登録していく方がいいのでしょうか。 PHPやMySQLは最近勉強し始めたので解り易く教えて頂ければ嬉しいです。 ソースなども添えて頂けるとありがたいです。 良い回答お待ちしています。

    • 締切済み
    • PHP
  • セッション脆弱性を克服するには?

    またお世話になります。 いつも的確な回答を頂いて助かっていますm( __ __ )m 【仕様】 ・ ログイン認証ページのみ SSL で、それ以外のページは 【非SSL】 です。 ・ ログイン認証時にセッションIDをクライアントのクッキーに保存し、サーバー側では MySQL にセッションIDとログイン情報を保持します。 ・ 認証以降のページでは、クライアントから送信されてくるクッキーセッションIDを元に MySQL のデータと照合し、ユーザーのログイン状態を維持します。 ・ 言語は PHP を使っています。 よくあるセッション管理サイトだと思います。 そして、セッションIDさえ盗まれなければセキュリティとして問題無いと考えています。逆に言うとセッションIDが盗まれると極端に弱いと思います。 【私の考える脆弱性】 ・ ログインページ以外が 非SSL ということから、セッションIDの盗聴が可能かと思います。 ・ 普通に使用していても悪意あるサーバーを経由したらトレースされて簡単にセッションIDが抜かれると思います。 ・ ログインした状態のユーザーが怪しいリンクをクリックしてクロスサイト攻撃でクッキーを抜かれる可能性もあります。 質問は、なぜ、こういった多くの問題が予測できるのに この「教えて!Goo」の認証もログインページはSSLですが、それ以外は非SSLです。といった具合に多くのサイトがこのような認証方式を取っているのか? もう一つ質問は、私は先に上げたような脆弱性を防ぐ方法がわからないのですが、何か画期的な方法でセッションハイジャックなどを防御しているのでしょうか? もしくはセッションIDが盗まれてもそのセッションIDでのアクセスを無毒化するような方法があるのでしょうか? 以上です。 よろしくお願いします。

  • セッションについて

    なんとかセッションを使えるようになってきた程度のものですが ここにきてちょっとした事が気になり質問させて下さい。 ポータルサイトをつくっており会員登録,ログイン,登録情報変更など 複数のフォームが存在します。 例えば・・・ ログイン時のセッション $_SESSION['login_id'],$_SESSION['login_pass'] 会員登録時のセッション $_SESSION['touroku_id'],$_SESSION['touroku_pass']など10程度 会員登録情報変更時のセッション $_SESSION['henkou_name'],$_SESSION['henkou_mail']など10程度 ・・・のような感じです。 全てセッションで管理していることが問題なのかもしれませんが いろんなページ(フォーム)をまわる度に多数のセッションを持っている 状態となってしまいます。 現状は、それぞれのページで必要のないセッションについては1つづつ unsetで明記し消去しているのですが多数あるのでどうも手間に感じて しまいます。 session_destroyで一括消去できれば楽なのですがログインしている 場合に必須なセッションもありそれもできない状態です。 この場合皆様はどのように管理をしているのでしょうか? 調べてみたのですが有力な情報もみつからず今後の参考になればと思い 質問させて頂きました。宜しくお願いします。

    • ベストアンサー
    • PHP
  • sessionについて

    こんばんは。お世話になっております。 題名にあるようにセッションに関してアドバイスいただきたく投函させて頂きます。 (他に似たような質問はあったものの、上手く解釈できなくて・・) 現在、DBに登録された会員のみがログイン出来る機能を有したサイトを作成しておりますが、DB参照の後、idなどを、セッション変数に代入し、そのデータを持ち歩いています。 書籍や他の方からセッションIDのことを耳にしますが、いまいち、その必要性というものを理解する事が出来ないのですが、このセッションIDは、どこでどういったところで必要になってくるものなのでしょうか? また、チェックボックスなどで任意により、自動でログインする機能を持たせるとした場合、クッキーを用いるという事までは理解したのですが、調べた範囲では、先のセッションIDをクッキーに保存させる・・という内容を多くみました。 現在、セッションハイジャックを避けるようサーバー側に保存されるセッションIDを書き換える設定をしているのですが、このような場合はクッキーを用いての自動ログインはどうしたらいいのだろう?と糸口が見えずにいる次第です。 以下、アドバイスを頂戴したいことをまとめると、 1.ログイン状態を認識させるためには、セッション変数だけで事足りるのか?また、この場合においてのセッションIDの意味するとは? 2.セッションハイジャックを避けるためサーバー側に保存させるセッションIDを随時変更している場合、自動ログイン機能を用いるには、どのような流れ(内容)になるのか? です。お忙しい中恐縮ですが、アドバイスなど頂けたら幸いに思います。宜しくお願い致します。

    • ベストアンサー
    • PHP
  • Perlでのセッション管理と不要セッション削除について

    いつもお世話になっています。 Perlにてセッション管理(ログインして、サイト内はユーザーIDなどを持ちまわるような)を行おうとしています。 CGI::Sessionを使用して実現できると思っているのですが、 疑問があります。 セッション情報の持ち方は、サーバー内にファイルか、DBに格納する ことになると思いますが、不要になったファイルやレコードは、 みなさんどうされているのでしょうか? (ログアウトボタンがあっても、ブラウザの閉じるボタンを押される ケースが多いと思いますので、必ずdelete()はできないですよね?) 削除バッチなどで定期的に削除することを考えていますが、 もっとスマートなやり方があればご教示いただければと思います。 よろしくおねがいします。

このQ&Aのポイント
  • ケーズデンキで購入したVEGAS MOVIESTUDIO17にはシリアルナンバーが付属されていないため、製品ユーザー登録ができない状況です。
  • 付属されているPIN番号を使用してソースネクストの登録はできましたが、製品ユーザー登録にはシリアルナンバーが必要であり、記載されていないため困っています。
  • ケーズデンキに相談しても詳しい人がいないため、こちらに相談しています。どうすれば製品を登録することができるのでしょうか?
回答を見る

専門家に質問してみよう