セッション値漏洩

こんにちは。恋をする心も、BlogのネタもカツカツなSaity先生です。
今日はWebサイト同士のセッションの重複について解説します。

例えば、1台のサーバー内でバーチャルホストを設定し、複数のサービスを運用するケースがあります。
一つのドメインに対して複数のWebサイトがPHPで構築されていると、まず危惧するべき点はセッションの重複です。

ではセッションが重複する例を見てみましょう。

http://test1.hoge.url/index.php


<?php
session_start();
$_SESSION = array();
$_SESSION['time'] = date("His");
header("Location: http://test2.hoge.url/index.php");
exit;

http://test2.hoge.url/index.php


<?php
session_start();
print_r($_SESSION);

…ホラネ?

バーチャルホストで別サイト同士かと思いっていると、落とし穴があるよ。
でも同ホスト内で全く別々の人間が開発する事は少ないでしょ。少なくても同じ会社とかだと思うし。

実はもう少し致命的なケースがあります。レンタルサーバーのようにユーザー毎のエイリアスが切られている場合が上記同様です。
各ユーザー間でセッションが重複する危険が潜んでいます。

まぁ、おわかりかと思いますが、こんな感じ。

http://www.hoge.url/~saito/index.php


<?php
session_start();
$_SESSION = array();
$_SESSION['time'] = date("His");
header("Location: http://www.hoge.url/~saity/index.php");
exit;

http://www.hoge.url/~saity/index.php


<?php
session_start();
print_r($_SESSION);

表示結果はバーチャルホストの例と同じでこんな感じです。


Array ( [time] => 151010 )

なぜこっちの方が質が悪いかお解りですね?
そう。見ず知らずのプログラム領域のセッション変数の内容が漏洩するからです。

ではなぜこのような問題が起こるのでしょうか。
それはphp.iniの設定にある、session.cookie_pathとsession.cookie_domainの設定がデフォルトのままだからです。

session.cookie_pathがデフォルトのまま「/」。
session.cookie_domainがデフォルトのまま「""」。

という設定だと、上記のような問題が発生します。
しかし、上記のケースにおけるサーバー管理者は、通常通り使えるような設定をしますが、二つはほぼ手の施しようがありません。

だからスクリプト内で解決しなければいけません!
各設定はINI_ALLです。session_set_cookie_params()関数を利用して上記の値を設定しましょう☆

http://test1.hoge.url/index.php


<?php
session_set_cookie_params('0', NULL, 'test1.asial.co.jp');
session_start();
$_SESSION = array();
$_SESSION['time'] = date("His");
header("Location: http://test2.hoge.url/index.php");
exit;

http://www.hoge.url/~saito/index.php


<?php
session_set_cookie_params('0', '/~saito/');
session_start();
$_SESSION = array();
$_SESSION['time'] = date("His");
header("Location: http://www.hoge.url/~saity/index.php");
exit;

どうよコレ!
あんまり使われない関数だけど、ちゃんと活躍できたでしょ→
詳しい解説は > http://phppro.jp/session_set_cookie_params

第一引数がセッションの有効時間。ここが'0'だとブラウザが閉じられるとクッキーが無効になるよ。
第二引数がセッションの有効範囲。指定したパス以下でのみセッションが復活するぞ!
第三引数もセッションの有効ドメイン。指定したドメインのみでセッションが復活☆
せっかくだから、
第四引数はhttpsとして暗号化かけていないとCOOKIEを投げないフラグ。
第五引数はCOOKIEにHTTP経由でしかアクセスが出来ない。但し、PHP4.0.4・PHP5.2.0からじゃないと使えないよん☆