Cookieを利用したログインについて

このQ&Aのポイント
  • Cookieを利用したログインのサンプルについて
  • セキュリティ的には問題ないのか?
  • セッション版の処理について
回答を見る
  • ベストアンサー

Cookieを利用したログインについて

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

  • re999
  • お礼率61% (476/777)
  • PHP
  • 回答数3
  • ありがとう数3

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

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

PHPのセッションって、結局、Cookieとの組み合わせで動いているもので、 session_start()関数を叩くと、まずはじめに、他と衝突しないランダムな文字列が返されます。 で、そのランダムな文字列をCookieに保存します。 それと同時に、その発行したランダムな文字列と同名のファイルを、php.iniなどで設定されているディレクトリに保存します。 そうすると、次回、ブラウザがそのCookieの内容をサーバに渡してくると、PHPは上記のディレクトリに保存したファイルの中身に記述されている値を$_SESSION変数に代入します。 ということで、CookieだけでログインID/パスワードを制御するということになると、 ブラウザ側に保存される領域にIDやパスワード、その他引き継ぎたい内容など全部保存しなければならなくなってしまいますが セッションは、状態を確認するためだけの認証用のランダムな文字列だけをブラウザにもたせるので、Cookieよりはセキュアになります。

re999
質問者

お礼

詳しく教えていただき、ありがとうございました。

その他の回答 (2)

回答No.2

> ということは、セッション管理をCookieで行なってもよいということでしょうか?  Cookie版の方はセッションとは無関係です。  無関係だからセッションが切れてもCookieが有効な限りログイン状態が保持されます。 > ここで用いられている「PHPの設定」の意味は、下記いずれでしょうか? > ・どういう風にPHPで書くか、という意味 > ・同じコードでも、php.iniなどのPHP環境に依存する、という意味  セッションIDの管理にCookieを用いるかURLパラメータを用いるかはphp.iniの設定です。ただし、Cookieを用いる場合はPHPのシステムが自動的にCookieの処理を行ないますが、URLパラメータを用いる場合はコード上でURLリンクを作成する必要があります。  ここでセッションIDの管理をCookieでやるというのと、Cookie版の方でログイン管理をCookieで行うというのはまったく別物だと考えてください。Cookie版でCookieに収めているのはあくまでログイン情報であって、セッションは無関係。セッション版の方はセッションの継続状態によってログイン状態を管理していて、そのセッションIDを保持する手段の一つとしてCookieを利用しているだけです。

re999
質問者

お礼

詳しく教えていただき、ありがとうございました。 説明が一番分かりやすかったです。

回答No.1

■Cookie版  セッションの代わりにCookieでアクセス判定を行っているのだから、セッション管理は行っていません。Cookieが有効な限りはセッションが変更されてもログイン状態は保持されます。Cookieのデータはクライアント側に保存されますので、サーバーはクライアントから送られたCookie情報を元にログイン状態を判定します。  セキュリティはどのレベルを要求するかによります。Cookie情報がネット上でやり取りされるのだから完璧なセキュリティは期待できませんが、機密情報をやりとりするのでない限りはある程度は実用的かと思います。 ■セッション版  セッションIDは「session_start();」を呼び出した時に、新たなセッションであった場合に新規に付加されます。セッションが継続している場合は既存のセッションIDが使われます。  セッション情報のやり取りには2通りあります。Cookieを用いる場合とURLパラメータを用いる場合です。どちらを用いるかがPHPの設定によります。Cookieの場合はクライアントのブラウザに保存されます。URLパラメータの場合は動的HTMLにてその都度URLを指示することになります。  セッション変数はセッションIDに結び付けられて、サーバー側で保存されます。

re999
質問者

補足

追加で教えてください。 ■Cookie版 >Cookieが有効な限りはセッションが変更されてもログイン状態は保持 ということは、セッション管理をCookieで行なってもよいということでしょうか? セッション管理を行なうのに、Cookieでいくか、セッションでいくかは、 好みの問題、ぐらいの認識でよいでしょうか? ■セッション版 >どちらを用いるかがPHPの設定によります。 ここで用いられている「PHPの設定」の意味は、下記いずれでしょうか? ・どういう風にPHPで書くか、という意味 ・同じコードでも、php.iniなどのPHP環境に依存する、という意味

関連するQ&A

  • Cookieを利用したユーザ管理

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

    • ベストアンサー
    • Perl
  • sessionとcookieの設定内容の区別

    セッションとクッキーの使い分け方法を教えていただけないでしょうか? 簡単に言えばセッションがサーバサイド、クッキーがクライアントサイド、 セッション内容はブラウザ切れば消える(残すことも出来る)、クッキーはブラウザに残る、 と言うことは分かっているのですが、実装の仕方が分かりません。 例えばログインフォームでは$_SESSION['name']、$_SESSION['password']を回す・・・というのは分かります。 認証が終われば$_SESSION['name']、$_SESSION['password']は破棄して$_SESSION['login']=TRUE等を使うのではないかと思っております。 (そうではなくて、認証後は全て$_COOKIEで処理するのでしょうか?) で、$_COOKIEにはsessionIDが入っていると。 しかしながら、ブラウザ切っても暫くしてまたサイトを訪れたときにログイン状態が続くようにするにはどのようにすればいいのでしょうか? $_COOKIEにその情報を格納するのだと思うのですが、例えば$_COOKIE内にユーザidやlogin=OKのような文字を入れているとブラウザから見えてしまいます。 勿論ハッシュ化をして簡単には把握できないでしょうが、ここにはどんな情報が格納されているのか見当も付きません。 具体的な$_SESSION、$_COOKIEに入れるものと、サイトでの各々の実装法を教えていただけないでしょうか?

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

    HTTPプロトコルで使われるCookieという機能について教えてください。 あるウェブサーバからあるブラウザのCookieを取得しようとするとき、 そのウェブサーバはそのウェブサーバが発行したCookieしか取得できない ということですが、これは正しいですか? また正しいとしたら、 それはブラウザ側が制御するのでしょうか? とぼけた質問かもしれませんが、どなたかぜひご教授ください。 また参考になるサイトがありましたら教えてください。

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

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

    • ベストアンサー
    • 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について教えてください

    (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を共有するには?

    現在、Cookieを使ってある情報をクライアント側に保持させる機能を作りたいと考えています。 そこで質問なのですが、例えば、IEでアクセスして"value=1"という情報を保持させました。 その後、Firofoxでアクセスした場合は、IEで保持された"value=1"という情報はなく、再度、振り直しで"value=2"という情報を保持させることになってしまいます。 これをブラウザ間で共有することはできるのでしょうか? ブラウザに依存することなく、一度振られた情報は不変のものとしたいので。 ブラウザのバージョンや種類、OSにもよるかとは思いますが、OSはWindowsXP、ブラウザはIE7、Firefox3.6で考えて頂いて構いません。 サーバー側はJavaで実装していますが、Cookieの設定・取得は現在はJavaScriptで実装しています。(とほほを参考に) JavaScriptでは無理だけど、Javaでならできるということであれば、サーバー側での実装に変えることもできます。 以上、ご回答よろしくお願いします。

  • PHP SESSION 設定について

    PHP(レンタルサーバー:5.3.6)(ローカル:5.3.26)を使用しています。 簡単なログインフォームを作っていました。 ローカルでテスト運用したところ、問題なく動作していたのでレンタルサーバーにアップロードしたところ、SESSIONが動いていない(?継承していない?)ことに気づきました。 そこでphpinfoを確認すると レンタルサーバーは、 session.cookie_httponly=1(On) session.cookie_secure=1(On) になっていました。XSS攻撃に全部ではないけどレンタルサーバーの設定だと有効だということなので、ローカルもレンタルサーバーの設定に合わせたいと思っています。 ※設定をoffにすると問題なく動作します。 sample2.phpで、「$_SESSION['sample_title']」が表示されなくなってしまいました。 どのようにすれば、sessionが正しく動作するかご教授お願いいたします。 抜粋スクリプト ■sample1.php session_start(); session_regenerate_id(TRUE); $_SESSION["sample_title"] = "PHPのSESSION"; //セッション登録 echo "$_SESSION['sample_title']に代入した値は「<?php echo $_SESSION['sample_title'] ?>」です。"; echo "<a href = 'sample2.php'>次のページ</a>"; ■sample2.php session_start(); session_regenerate_id(TRUE); echo "受け取ったセッション変数の値は「".$_SESSION['sample_title'] ."」です。";

    • ベストアンサー
    • PHP
  • cookie処理について

    cookieの事で質問させていただきます。 現在、本番稼動に向けて総合テストを行っています。 本番環境は、負荷分散させるためにcookieを参照し、2台で処理を振り分けています。 アプリケーション動作確認の際、自分が作成した部分をちょっといじっているとエラーが発生して落ちてしまいます。 落ちたところでも処理機能は、javaScriptでツリー表示を制御しています(UL,LIタグを利用)。 その処理で、どの項目が選択されたかを保持するためにcookieを使用していて、更新するときに以下のように書いています。 document.cookie="treeKey=" + opennodes; opennodesには1.3.5のようにピリオド区切りで入れています。 項目をリンク表示させていて、リンクを押下するとクッキーに書き込みに行くようになっています。 落ちている理由は、セッションの値がとれずシステムエラーを出していて、ログを見ると、リンクを押下した際にもう一方のサーバに接続してアクションを行おうとしていました。 alertを出して、リンク押下時にcookieに書き込まれたところまでは確認しています(セッションIDも同一) こういう負荷分散処理でcookieを使用(書き換えを頻繁に行うような使用方法)はだめなのでしょうか? 以上、説明がわかりにくいかもしれませんが、よろしくお願いいたします。

  • Cookieの発行について

    現在、複数のCookieを利用したシステムを構築中ですが、 Cookie管理の1つとして、配列でCookieを発行しようと考えております。 ブラウザ別に保有できるCookie数が限られていますので、 可能なかぎり少ないCookieで管理したいと思います。 そこで質問です。 配列でCookieを発行した場合、ブラウザ側で認識されるのは1つになるのでしょうか? それとも配列の要素分だけCookieを発行した形になるのでしょうか? どなたかお分かりになれば、ご教示いただけますと助かります。 よろしくお願いいたします。   

    • ベストアンサー
    • PHP

専門家に質問してみよう