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関数
サーバー側に保存されたセッションデータ(デフォルト設定ではファイル)を削除する。