• ベストアンサー

Cookieを利用したユーザ管理

perl(CGI::Session)を利用したセッション管理について教えてください。 【実現したい機能】 会員DB(IDやパスワードを保持)を使用し、認証を行い、 認証成功したらCookieを発行し、会員別のページを表示する。 会員DBのIDとCookieを紐づける機能は、CGI::Sessionにあるのでしょうか。 CGI側でCookieから会員DBのIDを結びつけるためには新たにファイルなどを作成する必要があるのでしょうか。

  • Perl
  • 回答数2
  • ありがとう数4

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

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

CGI::Sessionは元々Cookieを使用することを想定しています。 一般的なシナリオは以下のとおりです。 1) パスワードなどで認証したあと、CGI::SessionでセッションIDを作る 2) 1) のセッションIDをファイルやDBに保存する 3) 認証後の初めの画面でセッションIDをCookieでユーザのブラウザにセットする 1)と2)はCGI:Sessionのnewメソッドで一度にまとめることができます。 3) の方法はCGI::Sessionのheaderメソッドを参照して下さい。

okwave40
質問者

お礼

ご回答ありがとうございました!

その他の回答 (1)

回答No.1

Basic認証したユーザIDを取得する目的であれば、環境変数 REMOTE_USER を使用しては如何でしょうか。 私は、.htaccess を通過した後のindex.cgi で認証したIDを保持し、各CGI持ち回りでユーザ毎の処理を行っています。 -------------------- #!/usr/bin/perl # ..... # Basic認証したユーザデータを取得 my $username = $ENV{'REMOTE_USER'}; --------------------- 「Cookieと絡めたい」とか、「CGI:Session をどうしても使用したい」のであれば、話は別ですが・・

okwave40
質問者

お礼

ご回答ありがとうございます。 Basic認証ですとシンプルに実装できるのですね。 Basic認証はセキュリティ的に・・・と書こうとしたのですが、何がセキュリティ的に問題なのかわからなくなってしまったので、別件で質問したいと思います。

okwave40
質問者

補足

PCと携帯サイトを視野に入れているため、Basic認証はできるだけ使いたくありません。 hiddenパラメータによるセッションID方式を考えています。

関連するQ&A

  • CGI::Sessionでのユーザとの紐付け方法

    【できていること】 Cookieの発行 Cookieへのデータの書き込みと参照 【ここから質問】 ログイン認証があるWebアプリケーションにおいて、セッション情報(ID)とユーザ情報はどのように紐付けているのでしょうか? (ログイン成功時に生成するセッションIDとユーザ情報の紐付け情報をどこにどのように保持するのかがわかりません) Cookie(クライアント側)はセッションIDのみを保持しておいて、サーバ側で紐付け情報を保持するのだと思うのですが、CGI::Sessionではセッション生成時に作成されるcgise_XXXXファイルに書き込むのでしょうか?(そのメソッドか、具体例があれば教えてください) それとも紐付け専用のテーブルを用意しておくのでしょうか、もしくは、ユーザ情報のテーブルにあらかじめセッション情報を格納するカラムでも用意しておくのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • Cookieを利用したログインについて

    http://tenderfeel.xsrv.jp/php/628/ に、Cookieを利用したサンプルが掲載されているのですが、 このサンプルでは、セッションIDを発行せずに、セッション管理をすべてCookieで行なっている、のでしょうか? また、処理としては、サーバー側にはデータを何も保持せずに、 アクセスする度にブラウザから、(ハッシュ化したパスワードを含む)Cookie情報を送信して、 その一致を確認している、ということになるのでしょうか? セキュリティ的には、問題とかないのでしょうか? 次に、セッション版についてですが、 セッションIDは、スクリプトのどの部分で発行しているのでしょうか? また、処理としては、セッションIDはブラウザに、 それ以外のセッション変数は、サーバ側のセッション(?)に保存、 ということになるのでしょうか?

    • ベストアンサー
    • PHP
  • cookieについて教えてください

    (A) webサーバー側の設定によって、cookieにパソコンのMACアドレス、コンピュータ名、フルコンピュータ名、またはパソコン内に存在するファイル名を記録させることは出来るのでしょうか? (B) セッションcookie がwebサーバーから与えられる時には、ドメインの指定も備わっているため、セッションcookieは同時にファーストパーティーの形態を取り、[ファーストパーティの Cookie をブロックする]設定にしていると セッションcookie もブロックすると考えていたのですが Internet Explorer で、[ファーストパーティの Cookie をブロックする][常にセッション Cookie を許可する]状態でyahooメールにログインできました。 なぜでしょうか? http://itpro.nikkeibp.co.jp/article/COLUMN/20080221/294407/ セッションcookieにはドメイン指定があると書いてあります (1. Webアプリケーションが、Set-Cookie: NAME=VALUE; expires=DATE; path=PATH; domain=DOMAIN_NAME; secure (NAME=VALUEのみ必須)という形式のHTTPヘッダーを含めて、レスポンスを返す。) (C) http://blog.tokumaru.org/2013/02/purpose-and-implementation-of-the-logout-function.html ログインには[BASIC認証]と[フォーム認証]がありますが、ログアウトした場合、[BASIC認証]ではパソコン内に保存されたcookieは削除されず、[フォーム認証]では削除されるのでしょうか? (D) http://blog.tokumaru.org/2013/02/purpose-and-implementation-of-the-logout-function.html [フォーム認証]では、パソコン内のcookieにはセッションIDが保存されるだけだとありますが、googleや楽天のような大手ではなく、小さなショッピングサイトの中には[フォーム認証]でもcookieにIDとパスワードを保存するところがあるのでしょうか? それとも、そもそも[フォーム認証]では、cookieにIDとパスワードを保存できない、または出来るとしても今は保存するサイトはまず無いと考えてよいのでしょうか? (E) yahooやgoogleのログイン画面では、[ログインしたままにする][ログイン状態を保持する]というチェックボックスがあります。 このチェックボックスにチェックを入れてログインすると、cookieにはセッションIDではなく、IDとパスワードが保存されることになるのでしょうか? (A)(B)(C)(D)(E)について教えてください。

  • 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]

  • COOKIEを用いたセッション管理

    PHPでCOOKIEを用いたセッションチェックをしようとしています。 トップページを表示する関数とセッション管理の関数に分けて処理をしています。 function index(){ session_start(); if($this->CheckSession()) ログインのページ else ログオフのページ } function CheckSession(){ if(!$_COOKIE["hoge"]) DBにセッションID(COOKIE["hoge"]の値)を入れる setcookie("hoge",session_id()); return false; else  return true; } このとき更新ボタンを押すたびにCOOKIEの値が変わります。 なぜでしょうか?

    • ベストアンサー
    • 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
  • cookieの受け入れ?について。

    ある商品をネットで購入しようと思い、そこの会員になりました。 IDとパスワードが届いたので、それでその会社のページにログインしようと したら、IDとパスワードが認証されませんでした。 何度やってもダメでした。 その会社に認証されない旨をメールで問い合わせたところ、 「IDとパスワードの認証にcookieを使っております関係上、 cookieを受け入れる指定にして頂ければと思います。 特にInternet Explorer6のブラウザの場合ですと、 標準設定がプライバシーの設定箇所がcookieを ブロックする様になっておりますので、 cookieを全て受け入れる状態にして頂ければと思います。」 というような回答が帰ってきたので、 ツール →インターネットオプション →セキュリティ →レベルのカスタマイズ をみたところ、cookie は有効になっていました。 他に、どのようなトコロをチェックすれば、その会社のページにログイン できるのでしょう・・・・・。 大変困っています。

  • Cookieを用いてのセッション管理

    以前も問い合わせさせていただいた件なのですが、 未だ解決していないので、再掲させていただきます。 やりたいことは、 個人認証のページを作り、ログオフ後、ブラウザの戻るボタンを押しても、 ログイン中となるのを避けたい。 以下のような感じで、cookieを使って実現しようとしているのですが、 ログオフ時にcookieの削除は、うまくいったのですが、 ブラウザの戻るボタンでログイン中のページに戻ると、 $ENV{'HTTP_COOKIE'}の中身を見ると、実際にはCookieは削除されているにも関わらず、 Cookieの情報がよみこまれているため、ログイン中となってしまいます。 何か基本的なやり方を間違っているような気がします。 どなたかご教授願います。 ↓a1.cgi(ログイン画面)--------------  : (ID、パスワード認証後) #Cookie書き込み print "Content-type: text/html\n"; print "Set-Cookie: NAME=aaa; expires=Tue, 1-Jan-2030 00:00:00 GMT;\n"; print "\n";  : ↑a1.cgi(ログイン画面)-------------- ↓a2.cgi(ログイン中)--------------  : #Cookie読み込み $cookie01 = "$ENV{'HTTP_COOKIE'}\n";  : <HEAD> <!-- キャッシュクリア --> <meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Cache-Control" content="no-cache"> <meta http-equiv="Expires" content="Thu, 01 Dec 1994 16:00:00 GMT">  : </HEAD>  : ↑a2.cgi(ログイン中)-------------- ↓a3.cgi(ログオフ)--------------  : #cookie削除。 print "Content-type: text/html\n"; print "Set-Cookie: NAME=aaa; expires=Fri, 31-Dec-1999 23:59:59 GMT;\n"; print "\n";  : </HEAD>  : ↑a3.cgi(ログオフ)-------------- ※a1.cgi、a2.cgi、a3.cgiは同じディレクトリです。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 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点の質問ですが、どうか宜しく教えてくださいまし。

  • IDとパスワードの管理について

    超ド素人でまだperlとCGIについては基礎を勉強しているだけなので曖昧な質問ですみません。 現在ネットショッピングのサイトを作っていまして、会員専用のページを作るのに、IDとパスワードを設定しようと思ってネットでいろいろと調べておりました。 そこで.htaccessを使ってIDとパスワードを設定できるところまではわかったのですが、入会してきた会員のIDとパスワードを設定するにはサーバーにアクセスしてTeraTermなどで入力するしか方法はないのでしょうか? (参考にしたサイト→http://allabout.co.jp/computer/hpcreate/closeup/CU20020910A/index3.htm) 何か、これではちょっと管理しづらく会員全体の把握が難しいように思えます。インタフェースのようなもので会員のIDとパスワードを追加したり変更、削除したりできる方法はありますか? また、各会員にIDとパスワードの期日を設定して、その期日がくると使用できなくする、期日5日前に自動でメールを送る、というのもCGIでできるのでしょうか?ちなみにIDは会員のメールアドレスにしようと思います。 これからCGI・perlを始めるので(perlの基礎はわかります)参考になるサイトや書籍などでよいものがあればお教え願います。

    • 締切済み
    • CGI

専門家に質問してみよう