[PHP-users 12056] Re: 「他人の情報を表示するサイト」

HAYAKAWA Hiroshi php-users@php.gr.jp
Fri, 06 Dec 2002 09:35:52 +0900


早川@名古屋です。

on 02.12.4 2:21 PM, TAMURA Toshihiko at tamura@bitscope.co.jp wrote:

> 日経BPの記事に、Webサイトで他人の情報が表示されてしまう
> 問題について掲載されています。
> 
> 「他人の情報を表示するサイト」は対岸の火事ではない
> http://itpro.nikkeibp.co.jp/free/ITPro/OPINION/20021129/2/
> 
> | 「WWWサイトにアクセスして自分の個人情報を表示・更新しようとすると,画
> | 面に他人の情報が表示される」という現象が発生していたことが,2002年9月
> | 末から10月にかけて相次いで公表された。
> 
> 次のような問題が紹介されています。
> 
> o Java のマルチスレッドの取り扱いに関する問題
> o Java のオブジェクトが高負荷時に初期化されない問題
> o mod_perl のグローバル変数に関する問題
> o キャッシュ・サーバーとセッションIDに関する問題

PHPのセッション機能におけるセッションIDのユニークさに
みなさん言及されていますが、
PHPのセッション機能を使っていない者の一人として、
上記記事を読んで少し思った点を。

上記記事中に、

-----
Webアプリケーションでは,WWWサーバーが一人のユーザーによる一連のアクセ
スを一つのセッションとして認識できるように,セッションIDが発行すること
がある。一般に,セッションIDはCookieやURLなどに埋め込まれる。ここで,
セッションIDをURLに埋め込み,そのURLをリンクとしてHTMLに含める場合に問
題が起こり得る。WWWサーバーの負荷を軽減するために設置したキャッシュ・
サーバーが,ユーザーA向けのセッションIDを埋め込んだリンクをキャッシュ
していると,別のユーザーBが,同じセッションIDを使ってユーザーAの個人情
報にアクセスしてしまう。
-----

という風にありますが、
「セッションIDをURLに埋め込まない場合」
にも、もちろん<別人問題>は起こり得ますよね。

学校や企業等、
透過型のキャッシュサーバーが設置されていることも多いようなので、
キャッシュサーバーの存在を踏まえて
まずはそこにキャッシュさせないことが重要ではないかと思います。

(HTTP1.1の)仕様的には、
Cache-Control: private
を送ることで、
中間のキャッシュサーバーには保存されないようになっています。
(実際のキャッシュサーバーがちゃんと仕様に従っているかどうかはともかく)

PHPのセッション機能を使う場合には、
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0,
pre-check=0
Pragma: no-cache
というキャッシュがらみのHTTPヘッダも
レスポンスとして送られるようになっているようですが、
自前でセッション管理を行なう場合にはこれらも意識する必要があります。

ログイン認証を伴うシステムの場合でも、
セッション管理をcookieを用いて行なっている場合には、
(セッションIDのユニークさに関らず)
中間のキャッシュサーバーにキャッシュされていると、
あるIDでログインした場合に、
別のIDでログインしたときのキャッシュが表示され得ると思います。

つまるところ、
・キャッシュサーバーにキャッシュさせない
・セッションIDをユニークにする
・セッションの期限を短くする
・セッションIDそのものがバレないようにする
・クライアントブラウザにキャッシュさせない
・共有マシンを利用するときはログアウトやブラウザの終了を徹底する
といったあたりを、
背景を理解した上で組み合わせる必要があって、
いろんな状況・環境や、仕様通りでない実装なども踏まえると、
「どれが一つを徹底しただけではダメ」ですね。


PHPに限ったことではありませんけども、
上記の記事を読んでちょっと気になりました。


-----
With your dreaming, with your smile.
Hayakawa, Hiroshi <hayakawa@sam.hi-ho.ne.jp>
Nagoya,Aichi,JAPAN ☆彡