LoginSignup
58
58

More than 5 years have passed since last update.

PHPでセッションを使うときのクラス定義

Last updated at Posted at 2014-07-09

php.iniのセッション関連の設定

session_cookie_httponly = 1

クッキーに対して、HTTPを通してのみアクセスできるようにする。JavaScriptなどのスクリプト言語からのクッキーへのアクセスを禁止できるのでセキュリティが高くなる。ただしすべてのブラウザがサポートしているわけではない。

session.entropy_file = /dev/urandom
session.entropy_length = 32

生成されるセッションIDをより安全なものにする。

session.use_only_cookies = 1

セッションIDの保存先をクッキーに指定する。

session.use_trans_sid = 0

セッションIDをWebブラウザからサーバーに渡す方法の設定。クッキーではなく、代わりにURLに埋め込む方法を使う場合1にする。URLにセッションIDを埋め込むと、場合によってはセッションIDが外部に漏洩することがある。特別な理由がなければ0にする。

session.cookie_lifetime = 0

Webブラウザ側におけるセッションIDを保持するクッキーの有効期限を秒単位で設定できる。デフォルトの設定は0。0の場合、Webブラウザを閉じるとセッションIDを保持していたクッキーは削除される。よって、Webブラウザを閉じたときにセッションを終了させる場合は0に設定する。

セッションクラス参考

Session.class.php
<?php

// セッション管理のサンプル    セッション処理クラス
//-------------------------------------------

// セッション管理クラス
class Session {

    protected $timeout; // セッションタイムアウト時間


    // コンストラクタ
    // @param string $sessname セッション名
    // @param array $params オプション
    public function __construct($sessname = null, array $params = array()){
        if(is_string($sessname) && !empty($sessname)){
            session_name($sessname);
        }

        # sessname関数を使うと、セッション名を設定できる。セッション名は、セッションIDを保持するクッキーの名前として使われる。
        # 同じドメイン配下に複数との異なるアプリケーションを動かす場合、セッションが干渉しないようにする必要がある。
        # セッションをアプリケーションごとに分けるために、任意のセッション名を指定できるようにしている。

        // タイムアウト時間が指定されていないときは
        // セッションガーベジコレクタの時間をセッションタイムアウト時間とする
        $gc_maxlifetime = ini_get('session.gc_maxlifetime');
        $this->timeout = $gc_maxlifetime;
        if(is_array($params) && count($params) > 0){
            if(isset($params['timeout']) && ($params['timeout'] > 0)){
                if($gc_maxlifetime < $params['timeout']){
                    ini_set('session.gc_maxlifetime', $params['timeout']);
                }
                $this->timeout = $params['timeout'];
            }
        }

        # セッションタイムアウトの時間を取得。セッションタイムアウトはこのSessionクラスで管理している。
        # オプションでタイムアウト時間が指定されない場合、PHP設定のsession.gc_maxlifetimeの時間を
        # セッションタイムアウトの時間として使う。
    }


    // セッション存在チェック
    // @return boolean true: セッション開始中
    public function sessionExists(){
        if(isset($_COOKIE[session_name()])){
            return true;
        }
        return false;
    }

    # WebブラウザからセッションIDが送信されているかどうかをチェックする。


    // セッション開始とタイムアウトをチェック
    // @return boolean true     : セッションタイムアウトしていない
    //                 false    : セッションタイムアウトした
    public function start(){
        session_start();
        $now = time();
        $lastreq = $this->get('lastreq', $now); // 前回アクセス時刻を取得
        $this->set('lastreq', $now); //アクセス時刻を保存
        if(($lastreq + $this->timeout) <= $now){ // タイムアウト?
            return false;
        }
        return true;
    }

    # セッション管理機能を使うには、session_start関数を呼び出す。
    # session_start関数を呼び出した後、$_SESSION変数にアクセスすることで
    # セッションの読み出し、書き込みができるようになる。


    // セッションIDを生成しなおす
    public function regenerate(){
        session_regenerate_id(true);
    }

    # session_regenerate_id関数を呼び出すと、セッションIDを生成しなおす。
    # ログイン認証機能を実装する場合、ログインの成功後にセッションIDを変更する必要がある。


    // セッションの有効期限と有効なディレクトリを設定
    public function setRange($lifetime = 0, $path = $_SERVER['DOCUMENT_ROOT']){
        session_set_cookie_params($lifetime, $path);
    }

    # セッションの有効期限と有効なディレクトリを設定する。
    # ブラウザを閉じたときに破棄する場合は$lifetimeを0にする。
    # startメソッドを実行する前にsetRangeメソッドを実行する必要がある。


    // クッキー削除要求処理
    public function delCookie(){
        if($this->sessionExists()){
            $params = session_get_cookie_params();
            setcookie(session_name(), '', time() -4200,
                    $params['path'], $params['domain'],
                    $params['secure'], $params['httponly']);
        }
    }

    # セッションIDを保持しているクッキーを削除するようWebブラウザに要求する。
    # クッキーの削除を要求するには、setcookie関数でクッキーの有効期限を過去に設定する。


    // セッション終了処理
    public function endProc(){
        $this->clear();
        $this->delCookie();
        session_destroy();
    }

    # セッション終了処理をまとめて行う関数。自身のクラスのclearメソッドでセッション変数($_SESSION)のデータをすべて破棄する。
    # セッションIDを保持しているクッキーを削除するようWebブラウザに要求し、
    # session_destroy関数でサーバー側に保存しているセッションデータを削除。


    // session変数設定
    // @param string $key キー
    // @param mixed $value 設定する値
    public function set($key, $value){
        $_SESSION[$key] = $value;
    }


    // セッション変数取得
    // @param string $key キー
    // @param mixed $default 存在しない場合のデフォルト値
    // @return string セッション変数値
    public function get($key, $default = null){
        if(isset($_SESSION[$key])){
            return $_SESSION[$key];
        }
        return $default;
    }


    // セッション変数削除
    // @param string $key キー
    public function remove($key){
        if(isset($_SESSION[$key])){
            unset($_SESSION[$key]);
        }
    }


    // セッション変数クリア
    public function clear(){
        $_SESSION = array();
    }
}

セッションの削除方法

セッション変数のデータを破棄

$_SESSION = array();

メモリ内に残っているセッション変数の中身を空にする。

セッションIDを保存しているクッキーを削除するようWebブラウザに要求

setcookie関数

Webブラウザ側に保存されたセッションIDを保持しているクッキーを削除する。

サーバのセッションデータを削除する

session_destroy関数

サーバー側に保存されたセッションデータ(デフォルト設定ではファイル)を削除する。

58
58
11

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
58
58