- 締切済み
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点の質問ですが、どうか宜しく教えてくださいまし。
- ahirusanmm
- お礼率26% (6/23)
- Perl
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- 11th_style
- ベストアンサー率50% (45/90)
(1) はい、そうだと思います (2) ロードに失敗すると新規セッションを開始する仕様になっているようです。クッキーからSIDが正常に取れているかと、mysql上にSIDがきちんと保存されているか、調べてみて下さい。 ・・・あ、正式には"driver:mysql"らしいので、それが原因となっている可能性もありますね。
関連するQ&A
- CGI::Sessionの使い方
CGI::Sessionなどを使ったことがない初心者です。 どの端末から掲示板に投稿されたか識別するだけのために (セッションの画面遷移は不要) PerlのCGI::Sessionを使ってセッションIDを発行し、 CGI内のセッション記録用ファイルにいつどの端末から投稿されたか記録したいと思っています。 そこでCGI::Sessionについて調べてみたのですが my $session = new CGI::Session("driver:MySQL", $cgi, {Directory=>'./session'}); データーベースはMySQLでなければいけないのでしょうか? My SQLではなく例えばディレクトリ内のdate/session-date.textなどに記録し、 扱いことはできないのでしょうか? またそのような場合にはどのように記述するのか教えてください!
- ベストアンサー
- Perl
- 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
- cookieを介さずにCGI/PerlとセッションIDを遣り取りする方
cookieを介さずにCGI/PerlとセッションIDを遣り取りする方法 Adobe AIR HTML/Ajax で cookieを介さずにサーバーのCGI/PerlとセッションIDを遣り取りする方法について、何か情報ありませんでしょうか。 AIRはcookieをOSと共有するようなのですが、既定ブラウザがFirefoxの場合、共有できません。 幸い、AIRはローカルでのファイル操作が可能なので、自前でセッションIDの遣り取りと管理をさせたいと考えております。 で、以下の様にしてみましたが、nullが返ってくるだけでした。 PerlのセッションID発行はCGI::Sessionを使用しています。 [code] var cgi_url = 'http://server_name/cgi/session.pl'; var login_name = 'hoge'; var login_auth = 'fuga'; var msg = $.ajax( { type :'POST', url :cgi_url, data :'login_name=' + login_name + '&login_auth=' + login_auth }).responseText; alert(msg); [/code]
- 締切済み
- AJAX
- perlにおけるセッションIDについて
sessionIDがページを更新するたびに変わってしまいます。 その結果、前回セッションに保存した値を読み込めません。 my $cgi = new CGI; CGI::Session->name("SESSION_ID"); my $session = new CGI::Session("driver:File", $cgi, {Directory=>'./session'}); print $session->header(-charset=>'UTF-8'); print $session->id(); print $session->param("name"); #表示されず。 というようにしてセッションIDを表示すると、毎回変化します。 どうしたらIDを変わらないように出来るでしょうか? ちなみに、セッションに書き込むのは、 my $cgi = new CGI; CGI::Session->name("SESSION_ID"); my $session = new CGI::Session("driver:File", $cgi, {Directory=>'./session'}); $session->header(-charset=>'UTF-8'); $session->param("name", "abc"); $session->flush(); undef($session); こんな処理をしてます。
- ベストアンサー
- Perl
- セッション管理もどきを自作で
通販サイトを作ろうとしています。 ログインにはIDとPASSが必要ですが、ログイン中であることを知るためにログイン成功時にIDとPASSをそのまんまクッキーに記録しています。 その時点でセキュリティは最悪なので、セッションID管理というやつをやろうと思ったのですが、 CGI::Sessionだか何だかの説明ページが全く持って意味不明でしたので それっぽいことを自作しようと思います。 以下の流れのプログラムでセッション管理と同じような事をしていると思うのですが、あっていますか。セッション管理というものがいまいち分かりません。 ・WEBページよりIDとPASSを入力してログイン ↓ ・データベースにアクセスし、正しい情報であれば、 ランダムに作成した20桁くらいの文字列+IDをクッキーに保存、 その文字列をデータベースに保存、同時にIPアドレスも保存。 保存した時間も保存する。 (例:ID=OSIETE だったら、afkgiornsfshifownsiwOSIETE みたいな文字列になる) ↓ ・ページを移動するたびにクッキーから文字列を取得し データベースに保存されているかを調べる。 同一の文字列および同一のIP、および保存時間が現在時刻の24時間でなければNGとする。 ↓ ・ログアウト時、クッキーに保存された文字列と同じものをデータベースから削除する
- 締切済み
- Perl
- セッションとクッキーの関わりについて
いつもお世話になりますm( __ __ )m 質問の前に前提条件としてセッションによるログインサイトなどは、以下のようなやり取りを行っていると認識しています。 1. サーバーからクライアントにセッション ID を発行する 2. クライアントのクッキーにセッション ID が保存される 3. 以降、クライアントがサーバーにアクセスするとクッキーに保存されているセッション ID が一緒にサーバー側に送信され、サーバー側で保存しているセッションデータと関連つける。 ここまで間違っていたらご指摘ください。 以下、質問です。 上記の仕組みを PHP などを用いて既存のセッション関数を使わず自作するとした場合、以下のシーケンスで同等と考えてよろしいでしょうか? 1. サーバー側で乱数などを用いてセッション ID を独自に生成する 2. Set_Cookie 関数などでクライアントのクッキーにセッション ID を保存する。 3. 以降、クライアントのクッキーからセッション ID を取得し、サーバー側でその値を元に DB などから値を取り出す。 私には前者と後者が全く同じ処理に見えるのですが、違うのでしょうか。それとも同じなのでしょうか。と言ったところが聞きたいと考えています。 以上です。 よろしくご教授くださいm( __ __ )m
- ベストアンサー
- ネットワーク
- セッション管理におけるクライアント同時接続制限について。
皆さんこんにちは。セッション管理について教えて下さい。 Perlを使用し、cgiでWebのUIを作製中でして、CGI::Session.pmのモジュールで セッション管理を行っており、クライアントの同時接続数を1台に制限したいのですが、 うまくいかずに困っております。 クライアントからアクセスがあった場合に、最新のセッションを $session->expire 及び $session->empty で確認し、期限切れ、又は無効となっていたら新規セッションを発行している為、 クライアントがログアウトした場合は$session->deleteでサーバ内のセッションファイルを 削除できて問題はないのですが、ブラウザのxボタンで閉じてしまった場合、サーバ内の セッションファイルが削除されず、他のクライアントがログインできない状況になってしまいます。 セッションのデータはサーバ内のディレクトリに、セッションIDのみcookieで クライアントに保存という形態をとっております。 何か良い方法はないでしょうか?何卒ご教授のほど、お願い致します。 OS:FedraCore3 使用言語:Perl 5.8.6 Webサーバ:thttpd
- 締切済み
- Perl
- "use CGI::Session"でエラーが発生してしまいます
初投稿です。宜しくお願いします。 ActivePerl5.8.0+Apache1.3.14でSessionを使用した Webサイトを作成中なのですが、 ppm経由でインストールしたCGI::Sessionを useしようとしても、エラーになってしまいます。 サンプルコードは以下の通りです。 #!/usr/bin/perl use CGI::Session; &ses(); &print(); sub ses() { # Session作成・ここから my $session = new CGI::Session(undef, undef, {Directory => './tmp'}); my $tmpSID = $session->id(); $session->param('menu', 'MENU1'); $session->expire('+2h'); $session->header(); } sub print() { print "Content-type: text/html;charset=ISO-2022-JP\n\n"; print <<EOF; OK! EOF } use CGI::Session; の部分(と、Session関数を 呼び出している部分)をコメントアウト すると、とりあえずはエラーが出なくなるので、 原因はここだとわかっているのですが、 文法的に間違っているとは思えないですし、 困っています。 情報お願いいたします。
- ベストアンサー
- Perl
- セキュリティーを確保したセッション管理
現在、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
- CGI::Sessionでのユーザとの紐付け方法
【できていること】 Cookieの発行 Cookieへのデータの書き込みと参照 【ここから質問】 ログイン認証があるWebアプリケーションにおいて、セッション情報(ID)とユーザ情報はどのように紐付けているのでしょうか? (ログイン成功時に生成するセッションIDとユーザ情報の紐付け情報をどこにどのように保持するのかがわかりません) Cookie(クライアント側)はセッションIDのみを保持しておいて、サーバ側で紐付け情報を保持するのだと思うのですが、CGI::Sessionではセッション生成時に作成されるcgise_XXXXファイルに書き込むのでしょうか?(そのメソッドか、具体例があれば教えてください) それとも紐付け専用のテーブルを用意しておくのでしょうか、もしくは、ユーザ情報のテーブルにあらかじめセッション情報を格納するカラムでも用意しておくのでしょうか。 よろしくお願いします。
- ベストアンサー
- Perl