2016/05/04

PHP のセッションを破棄する場合の注意点


ドットインストールで、PHP のセッションを破棄するレッスンがあったのですが、セッション変数を unset() で削除しているのが気になりました。

PHPのマニュアルを見ると、セッションの削除は以下のようにするように記述されています(実際にはもう少し厳密な処理になっている。補足で解説)。

// セッション変数を全て解除する
$_SESSION = array();

// 最終的に、セッションを破壊する
session_destroy();

 

私も今までこの方法でセッションを削除しているのですが、unset() でもセッションを破棄できるようなのです。

ドットインストールでは、以下のように記述していました。

unset($_SESSION[‘username’]);

http://dotinstall.com/lessons/basic_php_v2/34130

 

ちょっと違和感があったので、調べてみたらこれはこれで問題ないようです。しかし、unset($_SESSION) とするのはダメで、unset($_SESSION(‘セッション変数名’)) とする必要があるとのこと。

詳しくは以下の記事の引用部分を参照してください。

なお、session_unset()を使うように説明しているページが多く見つかるが、現在の$_SESSIONを用いる書き方をしている場合、session_unset()を使ってはいけない

また、unset($_SESSION)などもしてはいけない。これをすると、セッション変数を格納する連想配列が消えてしまうことになり、セッション変数を登録できなくなってしまう。

セッション変数全体ではなく、あるセッション変数を消去したい場合にのみ、unset($_SESSION['セッション変数名'])を用いる。

http://d.hatena.ne.jp/Kappuccino/20080726/1217049706

 

これは注意が必要ですね。

このような注意点があるのであれば、PHP のマニュアルにある記載通りにセッションを削除する方法がベターではないかと思います。

 

※補足

PHP のマニュアルでは、セッション破棄の時、セッション ID の削除もしています。これは PHP が受信したセッション ID を受け付けてしまうという、セッションアダプションという脆弱性があるためと思います。

しかし、Web アプリケーションのログイン後にセッション ID の振り直しを行うことでこの問題は解消されるので、この記事ではセッション ID の破棄までは行っていません。


スポンサーリンク


このエントリーをはてなブックマークに追加




Twitter ではブログにはない、いろんな情報を発信しています。


コメント

コメントを書く



プロフィール

  • 名前:fnya
    経歴:
    SE としての経験は15年以上。様々な言語と環境で業務系システム開発を行い、セキュリティ対策などもしていました。現在は趣味SE。

    Twitter では、ブログでは取り上げない情報も公開しています。


    ブログについて

    このブログは、IT、スマートフォン、タブレット、システム開発などに関するさまざまな話題を取り上げたり、雑感などをつづっています。


    >>ブログ詳細
    >>自作ツール
    >>運営サイト
    >>Windows 10 まとめ

    Twitter のフォローはこちらから Facebook ページはこちら Google+ページはこちら RSSフィードのご登録はこちらから