セッションハイジャック と session_regenerate_id( )関数

【この記事の所要時間 : 約 4 分

●PHPのセッション管理の問題とは?

PHPのセッション管理は、セッションの固定化(Session Fixation)問題というのがある。この問題に対応するために、ログイン後にセッションIDを作り直して、ログイン後のセッションを保護するという対策が講じられる。
Session Fixationを原因としたセッションハイジャックを防ぐために、セッションIDを置き換える関数というのが、PHPには用意されている。それが、session_regenerate_id( )である。session_regenerate_id( )を使うとセッションIDは新しいものと置き換わるが、セッション情報を維持されるという特徴がある。しかし、使い方や挙動などで注意すべき点がいくつかある。まずはPHPのバージョンである。

●session_regenerate_id( )のバージョンによる挙動の差異

PHP5.1.0以降の場合は、ごく普通に以下のようにしてやれば、OK。

session_start();
session_regenerate_id(TRUE);

しかしながら、PHP5.1.0以前の場合は、以下のようにしてやらなければならない。

session_start();
$old_id = session_id();
session_regenerate_id();
unlink(session_save_path() . ‘sess_’ . $old_id);
ITPro参照

なぜなら、PHP5.1.0までは、古いセッション情報が削除されずにそのまま残っていたからである。PHP5.1.0以降はsession_regenerate_id(TRUE)とすることで、古いセッション情報が削除されるようになった。そのため、PHP5.1.0以前のPHPを使う場合は、古いセッション情報を明示的に削除する必要がある。
PHPでケータイからセッションを使う場合の設定方法

// セッション開始
session_start();
// 古いセッションを保存
$sess_tmp = $_SESSION;
// セッション変数を破棄
session_destroy();
// セッションIDを再生成
session_start();
session_regenerate_id();
// セッションを元に戻す
$_SESSION = $sess_tmp;

というやり方もあるみたいだが、欠点としては、アクセスの度にセッションファイルが作成されるため、ゴミファイルが残りやすいという点とのこと。

●session_regenerate_id( )のバージョン以外の問題とは?

PHPのバージョン以外の注意点としては、session_regenerate_id( )を使うと、リンクを連打するとセッションが飛んでしまう現象があるということと、session_regenerate_id( )を使うと、毎回セッションIDが変わるため通信エラーが起こった際に、セッションが切れてしまう可能性があるということ。
連打への対策としては、JavaScriptで連打できないようにするか、関数を使う間隔を設定するとか、SSLを利用してログイン時のみ書き換える仕様にするかがいいのかもしれない。
とはいえ、厳密には以下のサイトにもあるように、
ログイン後にsession_regenerate_id()を実行するだけで十分か?

ほとんどのアプリケーションはログイン後にsession_regenerat_id()を実行するだけで十分な安全性を確保することが可能ですが一部のアプリケーションはそれでは不十分であることは知っておいたほうが良いと思います。

ということは、頭の片隅を置いておいたほうがよさそう。
より詳しく知りたい方はこちらへ

プログラミングPHP 第3版
プログラミングPHP 第3版

posted with amazlet at 15.11.19
Kevin Tatroe Peter MacIntyre Rasmus Lerdorf
オライリージャパン
売り上げランキング: 44,636
スポンサーリンク
レクタングル(大)広告
  • このエントリーをはてなブックマークに追加
スポンサーリンク
レクタングル(大)広告

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です