PHPセッションでうっかりミスにご注意を!

CMSなどの管理ページを作成する際、PHPのセッションを利用することは多いと思いますが、みなさんはどのような手順で利用していますでしょうか。きっと「session_start()」して、「$_SESSION」へデータを入れたり見たりして、最後はある方法で破棄して、という感じでしょう。(ある方法はまた後日)

まぁ元々こういう使い方なんで当然と言えば当然ですよね。普通に利用する分には特に問題は無いでしょう。しかし、PHPのセッションは多くの場合Cookieを使っています。(URLパラメーターの話はまた後日)デフォルトで、Cookie名は「PHPSESSID」、利用するドメイン配下で参照可能になり、ここに落とし穴があるわけです。

先程、普通に利用する分には特に問題無いと言いましたが、同じドメインで「複数の管理ページ」を設置する場合に危険な落とし穴があるわけです。

「複数の管理ページ」とは・・・

○A社用管理ページ
www.domain.jp/company-a/
○B社用管理ページ
www.domain.jp/company-b/

のように、同じドメイン配下で2つの管理ページを作る場合です。ところで皆さん、管理ページへログインした後の、各ページでの認証チェックはどのようにされてますかね?大体下記のようにされているのではないでしょうか。

if(!isset($_SESSION[“ID”])){
print “ダメダメ、ダメよ”;
exit;
}

他のサイトや本で良く見ますね。何度も言いますが、普通に利用する分には特に問題は無いでしょうが、これをこの「複数の管理ページ」それぞれでこの同じ認証チェックをやってしまうと危険なんです。なんと、A社用管理ページにログインした後、B社用の管理ページにアクセスすると・・・・!

これは、Cookie「PHPSESSID」が同じドメインのものとして判断されるからなんですが、PHPのセッションはCookieのことをあまり意識せずに利用できるので、こういった落とし穴に気づきづらいわけですね。

セッション変数「$_SESSION[“ID”]」の「ID」だけでもそれぞれ違うものにしておけば、こういったことにはなりませんが、しなければならない対処方法は他にも色々あります。WEBや本には載っていない、独自のセキュリティ対策を考えるのも、開発者のささやかな楽しみですね。