CGIの単独実行を実現するセッション管理
Webメールや銀行のネットアクセス等のように、同時に複数のアクセスを避けたい場合に、
ユニーク(単一)な実行をするための1つの方法論です。
Yahoo!のログインやHOTMAILのサインイン時に、認証後に別のURLに飛ぶ方法と概論的には同じです。
理論
- 実行したいCGIにアクセスしたら、セッションチェックを行います。
セッションチェックは、セッションを識別するIDが、サーバ上(ファイル)とブラウザ上(クッキー)で一致するかを確認します。
- チェックがNoだったらセッション管理用のCGIに制御を移します(もちろん実行CGI内に組み込んでもOKです)。
(当然最初は認証されていませんので)パスワードにより認証を行います。
- 認証されたらセッションを識別するIDをサーバ上(ファイル)とブラウザ上(クッキー)に記録し、実行CGIに再アクセスさせます。
- セッションチェックがYesの場合はメインプログラムを実行します。
- ログアウトの際には、サーバ上(ファイル)とブラウザ上(クッキー)のセッションIDを消去します。
- CGIはそもそもバッヂ処理(1回1回処理が完了するもの)ですので、ログアウトせずに、または実行間隔が一定時間を経過した場合には、
自動的にログアウト処理を行います。
- セッション中(サーバ上にセッションファイルが存在)にセッション開始(認証)をしようとするアクセスがあれば、認証を拒否します。
アクセス
:
┌──┴───┐
│セッションID│No
│ 照合(*) ├→─┐ (*) ファイル=クッキーかどうか?
└──┬──┬┘ │
Yes: ↑ ↓
: │No┌─┴─┐
↓ └─┤ 認証 │
: └─┬─┘
┌──┴──┐ ↓Yes → ファイルとクッキーに...セッションID記録
│ 実行 ├─←─┘
└─────┘
※クッキーについて
クッキーは、ブラウザを特定する目的でセキュリティ上とても重要な役割をします。
ここで記録されるクッキーには、意味を持つ情報は含まれません。
クッキーを遮断しているブラウザでは安全が保てない(このセッション管理の前提が崩れてしまう)ので、
アクセスは拒絶されます。
注意事項
全く同時に認証が行われた場合にどうなるか。
このスクリプトでは、セッションIDにプロセス番号を含めています。
CGIの実行はプロセスが管理しているため、同時期に同じプロセス番号が存在しません。
セッションIDを記録するファイルには追記ではなく上書き処理になるため、
どちからのIDが記録されることになります。
その後クッキーに記録するための処理がされますが、それはそれぞれのブラウザへの記録になるため、
同時にそれぞれのIDが記録させてしまうかもしれません。
しかし、ID照合時に、ファイルに記録されたものと一致しないと実行できないため、
現実的にはユニーク(単一)なアクセスが実現されるであろうという理論に基づいています。
しかし、このスクリプトは簡易な方法ですので、厳重な管理を求めるような処理の認証には利用しないでください。
サンプルとダウンロード
-
- - サンプル( パスワード:123456 )
- - ダウンロード (session1.00.zip) 解凍の仕方
- - このシステムはフリーソフトですが、利用規定に従ってご利用ください。
- - サブルーチン類としてご活用ください。当方ではここに書いてある以外の情報提供は行いません。(バグ報告を除く)
- - 困ったらサポート掲示板 (掲示板利用上の注意)
技術メモ(上級者向け)
- もっと安全に…1
サーバ上に記録されるセッションIDを保存するファイルは、当然ながら不正アクセスで読み出されないことを前提にしています。
特に共用サーバで他人のディレクトリに簡単にアクセスできてしまうような管理をしているサーバだったら要注意です。
万が一セッションIDが知られてしまった場合、それをブラウザのクッキーに記録できればアクセスできてしまうことになります。
クッキーの記録にはその実行範囲を制限するpathが設定できます。このスクリプトではデフォルト(ルート)になっていますが、
より狭い範囲を指定することで、特に共用サーバ等ではそれを防止することが出来ます。(もちろん、ブラウザに直接書き込んでしまえばどうしようもありませんが…)
- もっと安全に…2
ファイルとクッキーに記録されるIDは同一のもので、"一致"するかどうかで照合しています。
認証時に発行されるIDを暗号化してファイルに記録し、暗号元となったIDはそのままクッキー(またはフォームで常時渡すようにする)に記録し、
アクセス時に読み出されたクッキー(またはフォームで送られたID)をその都度、ファイルに記録されたものと認証(暗号認証)するようにすれば、
もしファイル記録のデータが読み出されても、"一致"では照合されないので、より安全になると思います。
|