fc2ブログ

PEAR::Authで自動ログイン

しかし、仕事してて調べものしてて、自分のブログがヒットした時の気恥ずかしさと言ったら。。

タイトルに書いたことをしようとしていたのですよ。

で、最初は、「php.iniのsession.cookie_lifetimeを大きくしておけば大丈夫じゃん」って軽く思っていたのですよ。でも、そうすると、デフォルトは「次回からログインを省略する」ってことになってしまって、逆に「ログイン状態を保持しない」って時にどうするの?って問題にぶち当たりまして。

はじめは、session_set_cookie_paramsで、0を指定して、セッションクッキーにしてしまえ!って思ったんですけど、クッキーを発行するのは結局の所Authの中だったりして、知らないうちにsession.cookie_lifetimeで指定された期間保持されるクッキーが発行されてしまったりして。

で、色々調べてみたら、そもそもそのポリシーがいかんと。デフォルトはセッションクッキーにしておいて、明示的に「次回からログインを省略します」と指定されて初めて、その情報を保持すると。当たり前ですね。


で、結局PEAR::Authを使うのは止めて、一から作り直しと。こちらを参考にさせていただきました。

Webアプリセキュリティ対策入門 ~あなたのサイトは大丈夫? Webアプリセキュリティ対策入門 ~あなたのサイトは大丈夫?
大垣 靖男 (2006/03/16)
技術評論社
この商品の詳細を見る


PEAR::Authは、結局内部ではsession関連のPHP関数を使っているので、それを再度作るのはそんなに難しくないと言うことで。処理のイメージはこんな感じで:

  1. session.cookie_lifetimeは0のままにしておきます。セッションクッキー(ブラウザを閉じた時に破棄されるクッキー)がデフォルト。
  2. ユーザ管理テーブルにはユーザIDとパスワード、そして、自動ログイン時に用いるキー用のカラムを作っておきます。パスワードとキーはsha1関数をかまして、ハッシュ値にしておきます。
  3. 毎回、session_start関数でセッションを開始するようにしておきます。これまでは、PEAR::Authがやってくれていました。
  4. ログイン成功時に「次回からログインを省略します」のチェックがされていると、以下の処理を行います。ちなみに、ログイン成功後は$_SESSION配列にフラグを立てて、ログイン済みとします。各ページではこの配列を参照して、ログイン済みかどうかを判断します。セッション固定化攻撃を避ける意味で、session_regenerate_id関数を呼び出すのも忘れずに。
  5. 乱数、現在日時などを用いて、推測困難なキーを生成します。
  6. set_cookieで、上のキーを含むクッキーを発行します。これがユーザのブラウザに格納されます。この時の引数にクッキー保持期間を明示的に指定します。逆に、「次回からログインを省略します」のチェックがされていない場合には、このクッキーを削除する処理を行います。
  7. このキーをユーザ管理テーブルにも反映させます。このときsha1関数呼びます。
  8. 次回、サイトにアクセスした際には、クッキーの値を$_COOKIEで参照して、該当するユーザがいないかをキーをsha1関数通して、それをキーに(って分かりにくい)して、ユーザ管理テーブルを参照します。
  9. 該当するユーザがいれば、そのユーザでログインしたと言うことで、$_SESSION配列にフラグを立てます。これで、自動ログイン完了。キーはこのタイミングで再発行します。
  10. ログアウトした時には、クッキーを削除します。もちろん、session_destroyも。

楽しようとしてライブラリ使うと、今度は自由が利かないと言うことで。
スポンサーサイト



FC2 Blog Ranking


実験@2007/02/17 10:16   | 5 comments | 0 trackbacks |

コメント

PEAR::Authの自動ログイン

すみません。プログラム自体駆け出しでわからないので教えていただきたいのですが、現在PEAR::Authに自動ログインを付けたいと思っているのですが、いろいろなネットの記事を見てみたら、みんな自動ログインをつける場合はPEAR::Authは向いてないと書かれていましたが、PEAR::Authに自動ログインを付けるのは難しいのでしょうか?

2007/09/21(金)22:14| URL | 青2才 #w1SSDQgk [ 編集]

こんばんは

はじめまして。

僕も初めは、Authで自動ログインできないかなーといろいろ試してみました。が、認証機構自体、ライブラリにパッケージング化されていて、そこで自動ログインを実装するのは、無理っぽいって結論に至りました。

自動ログインを実現するためには、自分(サイト側)で希望する期間、保持されるクッキーが必須になるんですけど、PEAR::Authでログイン時に、このクッキーをプログラムから制御するメソッドが見当たらなかったんですよねー。セッションクッキーの制御ならphp.iniでできますけど。

自動ログインを選択可能にする、って時点でPEAR::Authは、ハイさよならーとなった次第です。

2007/09/27(木)21:59| URL | icot #A2lhOn8I [ 編集]

ありがとうございます。

やっぱり自動ログインの選択をつけたいのでPEAR::Authを使わない方向でがんばってみます。PEAR::Authにはじめから自動ログインの機能があったらと思う今日この頃です。

2007/10/02(火)15:01| URL | 青2才 #- [ 編集]

PEAR::Authで自動ログイン

PEAR::Authでも自動ログインできますよ。
クッキー部分だけ追加すればいいんです。
クッキーに暗号化したログイン情報を入れて、
正しければ$auth->setAuth($name);
とすればいいのです。
このsetAuth($name)は、
$nameを
「ログインとして扱う」という非常に便利なメソッドなんですね。

2008/11/18(火)13:46| URL | すずき #- [ 編集]

ありがとうございます。

すずきさん、はじめまして。

コメントありがとうございます。

なるほどー。当時は正直そこまでの知識無かったのです。で、改めて作ってみて、確かにそうなんだなーと思えた次第です。ありがとうございます。

setAuthの使い方にもそう言った意味があるとは…。まだまだ勉強です。。

2008/11/21(金)07:40| URL | icot #A2lhOn8I [ 編集]

コメントの投稿


秘密にする

«  | HOME |  »

いろいろ作ったり

プロフィール

icot

Author:icot
総合電気メーカで働く会社員でしたがいい年にも関わらずコンサルに転職。お酒、ジョギング、音楽、本、料理をこよなく愛してます。ここでは、日々感じた事を書き連ねるとともに、いろいろ実験してみたりしてます。
icotfeels[at]gmail.com

これまでに感じたこと